PHP中的preg_replace()帮助

时间:2009-04-30 06:37:31

标签: php regex

考虑这个字符串

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;
        }
    }

希望有一天能很好地帮助别人!再次感谢您的所有答案。

4 个答案:

答案 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);

不要投票给我。我知道这是黑客攻击。