【问题标题】:preg_replace() help in PHPPHP 中的 preg_replace() 帮助
【发布时间】:2009-04-30 06:37:30
【问题描述】:

考虑这个字符串

hello awesome <a href="" rel="external" title="so awesome is cool"> stuff stuff

我可以使用什么正则表达式来匹配没有出现在锚标题属性中的awesome

到目前为止,这就是我想出的(可悲的是它不起作用)

/[^."]*(awesome)[^."]*/i

编辑

我使用Alan M's advice 并使用正则表达式来捕获每个单词并将其发送到回调。感谢艾伦 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;
        }
    }

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

【问题讨论】:

    标签: php regex


    【解决方案1】:

    这个话题几乎每天都会出现在这里,基本上问题是:您不应该使用正则表达式来解析或更改 HTML(或 XML)。这就是 HTML/XML 解析器的用途。上述问题只是您将面临的问题之一。你可能会得到一些最有效的东西,但仍然会有一些极端的情况不起作用。

    只需使用 HTML 解析器。

    【讨论】:

      【解决方案2】:

      假设这与您不久前发布和删除的问题有关(那是您,不是吗?),这是您的基本方法是错误的。您说您通过替换关键字列表中的单词来自己生成这些 HTML 链接。问题是列表中更靠后的关键字有时会出现在生成的标题属性中并被错误替换——现在您正在尝试修复错误。

      潜在的问题是您要使用对preg_replace 的单独调用来替换每个关键字,从而有效地一遍又一遍地处理整个文本。您应该做的是处理文本一次,匹配每个单词并在关键字列表中查找它;如果它在列表中,请更换它。我没有准备好编写/测试 PHP 代码,但你可能想使用 preg_replace_callback:

      $text = preg_replace_callback('/\b[A-Za-z]+\b/', "the_callback", $text);
      

      "the_callback" 是查找单词的函数的名称,如果它在列表中,则生成适当的链接;否则返回匹配的单词。像这样处理每个单词可能听起来效率低下,但实际上它比您原来的方法效率更高

      【讨论】:

      • 艾伦,是的,就是我。我想我可能用词错误,所以我以简化的方式重新发布。我希望这不违反礼节,如果是,我道歉。无论如何,没有人给我一个可行的解决方案,也没有人投票赞成。我以前用过 preg_replace_callbacl() ,但我忘记了它有多方便。感谢您的回答 +1
      • 一些额外的信息...我正在处理很多字符串,并尝试查找数组中的值(更具体地说,键)是否存在于这些字符串中。然后我想提供一个指向他们定义的链接,以及一个启动的标题标签。我明天再考虑一下。
      • 好的,我现在已经开始工作了。谢谢 Alan M,我会发布我的解决方案。
      【解决方案3】:

      当然,使用解析库是工业级的解决方案,但我们都曾有过只想在 10 秒内写完东西并完成的时候。下次您想处理页面的大量文本时,忽略标签,尝试首先通过strip_tags 运行您的输入。这样,您将只获得简单、可见的文本,并且您的正则表达式能力将再次占据主导地位。

      【讨论】:

        【解决方案4】:

        这太可怕了,我犹豫要不要发布它,但如果你想快速破解,请扭转问题——不要找到不是 X 的东西,而是找到 IS 的东西,改变它,做这件事,然后把它改回来。

        这是假设您正在尝试将 awesome(更改为“wonderful”)。如果您正在做其他事情,请相应地进行调整。

        $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);
        

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

        【讨论】:

          猜你喜欢
          • 2011-07-21
          • 2011-05-09
          • 1970-01-01
          • 2011-03-10
          • 2011-06-21
          • 2011-10-05
          • 1970-01-01
          • 2011-11-12
          相关资源
          最近更新 更多