从字符串PHP中删除某些属性

时间:2013-11-06 22:00:10

标签: php html regex

再次问好Stackoverflow!

我想删除reltarget代码并将网址设为相对。

我的输入字符串是

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

提前致谢!

5 个答案:

答案 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实现此目的的最佳方法是什么。