这段代码有什么问题?

时间:2009-11-11 06:54:32

标签: php regex

我有一个包含一些链接的变量。现在我想检查点击了哪个链接,并删除其锚标记,以便人们可以知道哪个标签已被点击。

这是数据的示例: -

<a href="#" onclick="sort_data('All','all')">All</a> | <a href="#" onclick="sort_data('Diversified','1')">Equity</a> | <a href="#" onclick="sort_data('Liquid','1')">Liquid</a> | <a href="#" onclick="sort_data('Sector','1')">Sector</a>

现在我想要做的是,我看到哪个标签在js函数中被cliked然后使用php来替换那个特定的锚标签。但它运行不正常。

$links='<a href="#" onclick="sort_data('All','all')">All</a> | <a href="#" onclick="sort_data('Diversified','1')">Equity</a> | <a href="#" onclick="sort_data('Liquid','1')">Liquid</a> | <a href="#" onclick="sort_data('Sector','1')">Sector</a>
';
if(preg_match('/<A HREF="#" onclick="(.*?)>Equity/',$links))
{
    echo preg_replace('/<A HREF=(.*?)>Equity/','Equity',$links);
}

这是替换在Equity之前编写的所有内容,而我希望只删除Equity的锚标记,否则应该保持不变。我在这里做错了什么,如果有更好的方法来做到这一点,那么我会很感激地告诉我。

4 个答案:

答案 0 :(得分:2)

默认情况下,替换是“贪婪的”,并且匹配第一个“&lt; A HREF ...”一直到最后一个“Equity”。

尝试/<A HREF=([^<>]*?)>Equity/

[^<>]应将您的选择限制为非尖括号的字符,因此将其限制为单个href标记。

答案 1 :(得分:1)

您应该使用case insensitive flagpreg_match上的preg_replace。 preg_match也只匹配一个链接,如果你需要替换所有链接preg_match_all会更好。

$links='<a href="#" onclick="sort_data(\'All\',\'all\')">All</a> | <a href="#" onclick="sort_data(\'Diversified\',\'1\')">Equity</a> | <a href="#" onclick="sort_data(\'Liquid\',\'1\')">Liquid</a> | <a href="#" onclick="sort_data(\'Sector\',\'1\')">Sector</a>
';
if(preg_match('/<A HREF="#" onclick="(.*?)>Equity/i',$links))
{
    echo preg_replace('/<A HREF=([^>]*)>Equity/i','<A $1>Equity',$links);
}

注意:我不知道你为什么要在服务器端这样做,但最好在客户端使用javascript框架进行,jquery将是完美的做法这样的操纵。此外,您最好使非侵入式javascript 更好地进行维护,

答案 2 :(得分:0)

如果你想要做的就是摆脱<A HREF=...></A>标签,为什么不使用strip_tags功能?

答案 3 :(得分:0)

您的代码中存在多个缺陷:

  1. 您使用小写字母搜索大写字母。要解决此问题,请使用i(不区分大小写)选项或更改reg exp。
  2. 您忘记了结束标记</a>
  3. 贪婪的*将使用搜索到的前面的每个链接。
  4. (if分支可能是不必要的,如果你想继续使用被操纵的字符串。)
  5. 试试这个:

    $links='<a href="#" onclick="sort_data('All','all')">All</a> | <a href="#" onclick="sort_data('Diversified','1')">Equity</a> | <a href="#" onclick="sort_data('Liquid','1')">Liquid</a> | <a href="#" onclick="sort_data('Sector','1')">Sector</a>';
    if(preg_match('/<A([^<>]*)>Equity</A>/i',$links)) {
        echo preg_replace('/<A([^<>]*)>Equity</A>/i','Equity',$links);
    }