再次问好Stackoverflow!
我想删除rel
和target
代码并将网址设为相对。
我的输入字符串是
<a href="http://example.com/relative/path/" rel="external" target="_blank">Link</a>
<a href="http://example.com/relative/path" rel="external" target="_blank">Link</a>
我想要实现的目标是:
<a href="relative/path">Link</a>
<a href="relative/path/">Link</a>
所以我做的是:
$string = preg_replace("_<a href=\"http://example.com/(*.?)\" target=\"\_blank\" rel=\"external\">_si", "<a href=\"http://example.com/$1\">", $string);
但正则表达式证明是错误的。有人可以向我解释一下有什么不对,并告诉我正确的解决方案吗?
我知道我不应该使用正则表达式来解析HTML,但是对于字符串中的几个匹配,我认为它会更容易。
提前致谢!
答案 0 :(得分:1)
在你的正则表达式中,你有以下标记(target,rel)的错误顺序。这将以任何顺序删除所有这些:
$string = preg_replace("_<a href=\"http://example\.com/(.+?)\"((\w+=\".+?\")|\s*)*>_si", "<a href=\"$1\">", $string);
答案 1 :(得分:0)
我不确定你喜欢这个剧本的动态,但你可以试试这个正则表达式模式:
/ \ S(相对|目标)= “+。?” | HTTP(S *):// [A-Z0-9 |] + /
它将匹配rel和target属性,而不考虑它们的值,以及url的协议和域部分。同样,如果你指定你想要完成的任务,我可以建议一个更合适的模式。
答案 2 :(得分:0)
你快到了。
$string = preg_replace('@<a href="http://example.com/(.*)" (?:.*)>(.*)</a>@U',
'<a href="$1">$2</a>', $string);
U
标志使其不合适,因此第一个(.*)
不匹配太多。 (?:.*)
是一个匹配rel="external" target="_blank"
的非捕获组,但忽略它。
为了使其更强大,您可以稍微修改模式:
@<a(?:.*)href="http://example.com/(.*)"(?:.*)>(.*)</a>@U
答案 3 :(得分:0)
我已经解决了这个问题:
<?php
$string = '<a href="http://example.com/relative/path/" rel="external" target="_blank">Link</a>
<a href="http://example.com/relative/path" rel="external" target="_blank">Link</a>
';
//
$string = preg_replace("#<a href=\"http://example.com/(.*)\" rel=\"external\" target=\"_blank\">#i",
"<a href=\"/$1\">", $string);
//
echo "<textarea style=\"width: 700px; height: 300px;\">";
echo $string;
echo "</textarea>";
?>
您的错误在
(*.?) that should be (.*)
答案 4 :(得分:-1)
您可以使用jQuery over PHP轻松完成此任务。
$("a").each(function(){
$(this).removeAttr('rel');
$(this).removeAttr('target');
});
我不确定使用PHP实现此目的的最佳方法是什么。