考虑这个字符串
hello awesome <a href="" rel="external" title="so awesome is cool"> stuff stuff
我可以使用什么正则表达式来匹配任何未出现在锚点的title属性中的awesome
的出现?
到目前为止,这是我想出来的(它不会遗憾地工作)
/[^."]*(awesome)[^."]*/i
我使用Alan M's advice并使用正则表达式捕获每个单词并将其发送回回调。感谢Alan M的建议。这是我的最终代码。
$plantDetails = end($this->_model->getPlantById($plantId));
$botany = new Botany_Model();
$this->_botanyWords = $botany->getArray();
foreach($plantDetails as $key=>$detail) {
$detail = preg_replace_callback('/\b[a-z]+\b/iU', array($this, '_processBotanyWords'), $detail);
$plantDetails[$key] = $detail;
}
_processBotanyWords()...
private function _processBotanyWords($match) {
$botanyWords = $this->_botanyWords;
$word = $match[0];
if (array_key_exists($word, $botanyWords)) {
return '<a href="' . PATH_BASE . 'articles/botany-words/#botany-word-' . str_replace(' ', '-', strtolower($word)) . '" title="' . trim($botanyWords[$word]) . '">' . $word . '</a>';
} else {
return $word;
}
}
希望有一天能很好地帮助别人!再次感谢您的所有答案。
答案 0 :(得分:3)
这个主题几乎每天都出现在这里,基本上问题是:你不应该使用正则表达式来解析或改变HTML(或XML)。这就是HTML / XML解析器的用途。上述问题只是您将面临的问题之一。你可能得到的东西大部分都有用,但是仍然会有不适用的极端情况。
只需使用HTML解析器。
答案 1 :(得分:2)
假设这与您前一段时间发布和删除的问题有关(那是你,不是吗?),这是你的基本方法,这是错误的。您说过通过替换关键字列表中的单词来自己生成这些HTML链接。麻烦的是,列表中较远的关键字有时会出现在生成的标题属性中并被错误替换 - 现在您正在尝试修复错误。
潜在的问题是,您使用单独调用preg_replace
替换每个关键字,有效地一遍又一遍地处理整个文本。您应该做的是处理文本一次,匹配每个单词并在关键字列表中查找;如果它在列表中,请替换它。我没有设置编写/测试PHP代码,但您可能想要使用preg_replace_callback
:
$text = preg_replace_callback('/\b[A-Za-z]+\b/', "the_callback", $text);
“the_callback”是查找单词的函数的名称,如果它在列表中,则生成相应的链接;否则它返回匹配的单词。它可能听起来效率低下,处理这样的每个单词,但实际上它比你原来的方法有很多更多效率。
答案 2 :(得分:1)
当然,使用解析库是工业级解决方案,但我们有时候只是想在10秒内写出来并完成。下次要处理页面的多汁文本时,忽略标记,首先尝试通过strip_tags运行输入。通过这种方式,您将只获得简单明了的文本,并且您的正则表达能力将再次占据至高无上的地位。
答案 3 :(得分:1)
这太可怕了,我犹豫发布它,但如果你想快速破解,反转问题 - 而不是找到不是X的东西,找到 IS 的东西,改变它,做它并改变它。
这假设您正在尝试改变真棒(“精彩”)。如果您正在做其他事情,请相应调整。
$string = 'Awesome is the man who <b>awesome</b> does and <a href="awesome.php" title="awesome">awesome</a> is.';
$string = preg_replace('#(title\s*=\s*\"[^"]*?)awesome#is', "$1PIGDOG", $string);
$string = preg_replace('#awesome#is', 'wonderful', $string);
$string = preg_replace('#pigdog#is', 'awesome', $string);
不要投票给我。我知道这是黑客攻击。