2011-07-08 15 views
1

正規表現の一部が、特定の終了タグ自体に含まれていない場合は、キーワードの周りに<strong>というタグを追加します。正規表現の終了タグの置き換えの問題

A test line 

へ:

A <strong>test</strong> line 

が、これは変更されません。

これは、常にキーワードは testた場合
foreach ($keywords as $keyword) { 
    $str = preg_replace("/(?!(?:[^<]+>|[^>]+(<\/strong>|<\/a>|<\/b>|<\/i>|<\/u>|<\/em>)))\b(" . preg_quote($keyword, "/") . ")\b/is", "<strong>\\2</strong>", $str, 1); 
} 

だから、これは変化するであろう...うまく働いています
<a href="">A test line</a> 

可能な限り無視したい終了タグのリストが正規表現内にあることを確認してください。

私たちがどのように見える文字列を使用して問題が発生している:

<a href="">A test <em>line</em></a> 

それは

<a href="">A <strong>test</strong> <em>line</em></a> 

...として出て来るので、それは、そのことについては決算</a>または</em>を認識していないが私たちはそれがしたくない。誰もがこれに修正があるかどうかを知ることができます(そして、はい、私は正規表現のルールでHTMLを解析しないので、その悪名高い投稿へのリンクを投稿することは答えではありません;-))

+1

申し訳ありませんが、あなたがそれを認識している場合、なぜあなたはまだRegexでHTMLを解析していますか? ;-) –

+2

正規表現ルールでHTMLを解析しないことに気付いているので、私は悪名高い投稿へのリンクをとにかく投稿します:http://stackoverflow.com/questions/1732348/regex-match ($ {str = preg_replace( '/(?<!<(a | b | i | u | em | strong)。*?>。*?})\ -open-tags-except-xhtml-self-contained-tags –

答えて

2

次の正規表現はキーワードtesta,b,i,u,em,strongタグで囲まれていません。

正規表現

/^.*?(?!<(a|b|i|u|em|strong).*?>.*?)\btest\b(?!.*?<\/\1>)/i 

テスト

A test line       => MATCH 
<a href="">A test line</a>   => NO MATCH 
<a href="">A test <em>line</em></a> => NO MATCH 

議論

^.*?(?!<(a|b|i|u|em|strong).*?>.*?) => The keyword `test' must not be preceded by 
             any tag listed followed by any character 
\btest\b        => Here we define the keyword we want to match 
(?!.*?</\1>)       => The keyword `test' must not be followed by 
             the tag opened previously 

ヒント複数のキーワードのための正規表現を向上させることができ

(KW1、KW2、KW3以下の例では)このように:

/^.*?(?!<(a|b|i|u|em|strong).*?>.*?)\b(?:kw1|kw2|kw3)\b(?!.*?<\/\1>)/i 

この正規表現は、実際に提供に取り組んでいます

を警告すべての症例で検査するわけではありません。

+0

btest \ b(?!。*?)/ i '、 "\\ 2"、 "A test line"、1); エラーを出します:不明な修飾子' \ ' – fire

+0

PHP regexフレーバー制限に従ってregexpを変更しました。 – Stephan

+0

正規表現はこの場合にはあまり適していないことを認めなければなりません。とにかく、そのような挑戦はいつも楽しいです。 – Stephan