1

再次您好 Stackoverflow!

我想删除relandtarget标记并使 url 相对。

我的输入字符串是

<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,但是对于字符串中的几个匹配项,我认为它会更容易。

提前致谢!

4

5 回答 5

1

在您的正则表达式中,您的以下标签(目标,rel)顺序错误。这将按任何顺序删除所有这些:

$string = preg_replace("_<a href=\"http://example\.com/(.+?)\"((\w+=\".+?\")|\s*)*>_si", "<a href=\"$1\">", $string);
于 2013-11-06T22:20:38.143 回答
0

我不确定你喜欢这个脚本有多动态,但你可以试试这个正则表达式模式:

/\s?(rel|target)=".+?"|http(s*)://[a-z0-9|.]+/

它将匹配 rel 和 target 属性,而不管它们的值,以及 url 的协议和域部分。同样,如果您指定要完成的任务,我可以建议更合适的模式。

于 2013-11-06T22:22:08.583 回答
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
于 2013-11-06T22:22:53.903 回答
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 (.*)
于 2013-11-06T22:28:42.027 回答
-1

您可以使用 jQuery over PHP 轻松完成此操作。

$("a").each(function(){
    $(this).removeAttr('rel');
    $(this).removeAttr('target');
});

我不确定用 PHP 完成此任务的最佳方法是什么。

于 2013-11-06T22:14:02.013 回答