我正在尝试在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中完成,以及如何实现,但任何帮助都会被贬低。
答案 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 ...)