2013-05-07 40 views
2

我正在寻找正则表达式(php)来查找/替换网页中的某些单词。但是,它不能替换所有html标签之间的单词,只能在以下内容之间进行替换:斜体< i>,粗体< b>和纯文本。正则表达式替换网页中的单词

实施例:

词: “你好”(不区分大小写)

<a href="#">Hello</a> im a writer that i like to say hello everyday. <b>Hello</b> Spiderman. 

替代:在锚着的更换,仅你好和< b>Hello< /b>可以被替换。

我测试了一些正则表达式,但没有正常工作:

1)从SMART SEO链接(WP插件)

$reg = '/(?!(?:[^<\[]+[>\]]|[^>\]]+<\/a>))\b($word)\b/Imsu'; 

不能很好地工作,有时,删除该内容,并把simbol“>” 我对这个正则表达式做了一些修改,删除了“?!”或“?:”(我不知道是什么意思),但停止工作。

2)其他我已经试过:

$reg = "/<([\w]+)[^>]*>\b('.$word.')\b<\/\1>/Imsu"; 
$reg = '/<+\s*\/\s\b('.$word.')\b[^>]\/\s>+/I'; 

不能代替任何

$reg = '/<(\w+)[^>]*>\b('.$name.')\b<\/\1>/Imsu'; 

有时工作。

事实是,我不是正则表达式专家,我几天测试,试图创建一个新的正则表达式,但没有达到我需要的结果。

事实是,取代将在WP插件使用,这有时会影响到模板或其他插件或DOM心不是很好创建

任何人有任何想法,为什么不能正常工作?谢谢。这些模式的

+1

Id'为此使用DOM,也许是http://simplehtmldom.sourceforge.net/。 – elclanrs 2013-05-07 10:52:52

回答

2

尝试组合

$reg = '/(?:<(\w+)[^>]*>)?\bhello\b(?!<\/a>)(<\/\\1>)?/i'; 
$reg0 = '/<\w[^>]*\bhello\b[^>]*>/Ui'; 

$word = preg_quote('hello','/'); // to avoid PCRE injection 
$str = '<a href="hello.php">Hello</a> I say hello everyday. <b>Hello</b> Spiderman.'; 
$reg = '/(?:<(\w+)[^>]*>)?\b'.$word.'\b(?!<\/a>)(<\/\\1>)?/i'; 
$reg0 = '/<\w[^>]*\b'.$word.'\b[^>]*>/Ui'; 

function handler($m) { return str_replace($GLOBALS["word"],'!X!',$m[0]); } 

$str = preg_replace_callback($reg0,'handler',$str); // replace "hello" for say !X! inside tags  
$str = preg_replace($reg,'[deleted]',$str); // delete "hello" elsewhere 
$str = str_replace('!X!',$word,$str); // put "hello" inside tag back 
print_r($str); 

结果

<a href="hello.php">Hello</a> I say [deleted] everyday. [deleted] Spiderman. 

说明你的问题

说明

查看关于上述断言的链接:?<!负向后断言不能用于匹配<a href="#">,因为它不是固定长度并导致编译错误。因此,我使用了前瞻断言?!与hello后的</a>匹配。开头和结尾的括号包括任何周围的HTML标签,因此除了在</a>断言之外的所有内容都被替换。

的办法来避免你好更换标签内是替代他们一些独特的字符串(比如!X!)然后做原来的更换,然后更换回!X!你好回来。它可能不是最好的解决方案,但它的工作原理。

为什么你的正则表达式没有工作

您使用/I修饰符(在你的模式结束)。修饰符区分大小写,/i表示不区分大小写的评估,请参阅the list of modifiers。我相信你的模式中的\b(字边界)是多余的。

+0

多数民众赞成在工作,但它不是真正的即时通讯寻找。这个想法了,只有更换: (1)纯文本或标签(2)文本或(3)文本之间的文本 你的正则表达式替换锚内的文字: 文本必须不能代替 结果我要找应该是这样的: 'Hello IM,我想说[删除] everyday.' – Zuljin 2013-05-07 16:37:42

+1

@JuanVargasZuljin作家:我明白了。我已经更新了我的答案 - 现在能工作吗? – 2013-05-07 17:36:12

+0

再次感谢。我正在测试它,但是当出现这样的情况''str =“Hello我每天都会打招呼。你好 Spiderman。”;' 结果将是 'Hello我说每天[删除]。 [删除] Spiderman.' 正如您所看到的,还会在“href”内进行替换,并确保在上的其他属性中进行替换,这可能很危险。你有什么想法 ?太难解决了? – Zuljin 2013-05-08 09:53:17