我使用preg_replace
函数清除rel
中的所有target
和$body
属性,并将其替换为其他值。这是:
$patterns = array();
$patterns[] = '/<a(.*) rel="([^"]*)"(.*)>/';
$patterns[] = '/<a(.*) target="([^"]*)"(.*)>/';
$patterns[] = '/<a(.*)>/';
$replacements = array();
$replacements[] = '<a$1$3>';
$replacements[] = '<a$1$3>';
$replacements[] = '<a rel="nofollow" target="_blank"$1>';
$body = preg_replace($patterns,$replacements,$body);
问题在于它与单引号和无引号不匹配。
此外,如果有更好的方法可以清除链接中的rel
和target
属性并将其设置为其他属性,请提供建议。
由于
编辑:$body
:
$body = '<a href="TEST">Link1</a>
<a href="TEST" rel=\'lqlqlq\'>Link2</a>
<a href="TEST" target="_blank" rel="lqlqlq">Link3</a>
<a href="TEST" target=_blank rel=lqlqlq>Link4</a>';
由于文本的原因,工作链接的所有其他选项都是用户定义的,可能有些用户会作弊。我的目标 - $body
中的所有链接都与定义的rel
和target
属性无关,无论用户输入了什么。
答案 0 :(得分:1)
如果您不想同时匹配任何其他内容,我建议您不要同时保留系统资源。
$patterns[] = "/rel=[\"\']?([\w]+)[\"\']?/";
$patterns[] = "/target=[\"\']?([_a-zA-Z]+)[\"\']?/"
我不是最好的REGEX,但就我所知,这会为你节省一些时间。
答案 1 :(得分:0)
最有可能与它们相匹配,但由于<a(.*)>
总是匹配,无论前两个是什么,你都不会从前两个模式得到任何结果。
这可以做你想要的:
$patterns = array();
$patterns[] = '/<a(.*) rel=[\'"]?\S+[\'"]? (.*)>/';
$patterns[] = '/<a(.*) target=[\'"]?\S+[\'"]? (.*)>/';
$replacements = array();
$replacements[] = '<a$1$3>';
$replacements[] = '<a$1$3>';
$body = preg_replace($patterns,$replacements,$body);
干杯。
答案 2 :(得分:0)
这个表达式将处理3个选项:
&#39; / HREF = [&#34; \&#39;]?([^&#34; \&#39;&GT;] +)[&#34; \&#39;] ?/&#39;