2016-03-24 3 views
0

を必要としていました。 この単純な非有効なHTMLPHPのマルチバイト正規表現は、これが今一日、私を盗聴され

<p clneck="something">my neck hurts</p> 

を想定今私は、単純な

preg_replace("/neck/", "head") 

は私に

<p clhead="something">my head hurts</p> 
を与えるだろうもちろん head

neckを置き換えるためにpreg_replaceを使用したいです

あなたはポイントを持っています。

DOMDocumentでビルドしようとしましたが、2回失敗しました.HTML5用にビルドされていないため、天井のネストされたタグでも失敗しました。

+0

それはどのように失敗したのか?何を試しましたか?その正規表現でなぜ「お尻」が「頭」になったのですか?これらはマルチバイト文字でもありません。 – chris85

+1

まず、[preg_replace](http://www.tutorialspoint.com/php/php_preg_replace.htm)の使い方を確認してください。 3番目のパラメータがありません。 @ chris85:私は質問を編集したので、今度は首だ:D –

+0

@noob ahaはもうちょっと意味がある。正規表現の振る舞いにマッチする 'class'属性を修正しました。マルチバイトの問題とOPの使用法についてはまだ不明です。 – chris85

答えて

0

$1のような後方参照を使用して行うことができます。

簡単な例だけで扱うのpタグ:

$input = '<p clneck="something">my neck hurts</p>'; 
$output = preg_replace('/(<p\s+[^>]+>[^<]*)neck([^<]*<\/p>)/i', '$1head$2', $input); 

我々はあまりにも、一致する正規表現内の参照(\\2を)必要がありますので、それは少し複雑になりますすべてのタグを処理するために:

$input = '<p clneck="something">my neck hurts</p><div idneck="foo">my neck hurts, too</div>'; 
$output = preg_replace('/(<(\w+)(\s+[^>]+)>[^<]*)neck([^<]*<\/\\2>)/i', '$1head$4', $input); 
echo $output; 
+0

悪くありません。しかし私が見る限り(私がテストする前に)、これは

を処理するだけです。 - 他のすべてのタグはどうですか? – Juergen

+0

すべてのタイプのタグを扱うために私の答えを調整しました。 – maxhb

関連する問題