PHP正则表达式href标题未设置

时间:2011-04-18 21:40:48

标签: php regex href title

我正在尝试在PHP中创建一个函数,该函数将在字符串中搜索所有href出现,如果未设置title,则应将其替换为> text </a>之间的文本值 我不知道最好的方法是什么,想一想像:

$s = preg_replace('/<  a[^>]*?href=[\'"](.*?)[\'"][^>]*?title=[\'"](.*?)[\'"][^>]*?>(.*?)<\/a>/si','<  a href="$1" title="$2">$3</a>',$s);

我如何检查正则表达式以查看是否设置了$ 2,如果它不是用$ 3替换它,也可以是$ 3就像img src =“...”alt =“...”和这种情况我想得到alt的价值。

首先,我想知道这是否可以在PHP中完成,以及如何实现,但任何帮助都会被贬低。

2 个答案:

答案 0 :(得分:0)

也许假定它不会被设置并仅查找title=''

$preg_replace("/<a[^>]*?href=[\'\"](.*?)[\'\"][^>]*?title=''>(.*?)<\/a>/i","<a href='$1' title='$2'>$2</a>","<a href='http://google.com' title=''>Google</a>");

输出:

<a href='http://google.com' title='Google'>Google</a>
祝你好运。

修改

抱歉,不太清楚你的意思:

  

$ 3也可以是img src =“...”alt =“...”,在这种情况下我想得到alt的值。

示例中的$3不是链接文字吗?

答案 1 :(得分:0)

没有信息的链接是适合这里的。这对于regexpressions来说并不容易。例如,您不能使用带有前向反向引用的(?!\4)否定断言来将title=<img alt=属性进行比较(这对于提取已经足够困难)。

至少你必须使用preg_replace_callback并在一个单独的函数中处理替换。在那里,更容易打破属性并比较alt =与title =。

如果您不使用它进行输出重写,则不使用regexpressions使任务更简单。这在性能方面不是更好的选择,但很容易用例如phpQuery或QueryPath

$qp = qp($html);
foreach ($qp->find("a") as $a) {
    $title = $a->attr("title");
    $alt = $a->find("img")->attr("$title");
    if (!$title) { $a->attr("title", $alt); }
}
$html = $qp->top()->writeHtml();

(同样可以做,只有使用更详细的代码,使用DOMDocument ...)