我使用preg_replace
函数,该函数必须从$body
中清除所有rel
和target
属性,并用其他值替换它们。这是:
$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
属性,无论用户输入了什么。
如果您不想同时匹配任何其他内容,我建议您不要这样做,并保留系统资源。
$patterns[] = "/rel=['"'']?(['w]+)['"'']?/";
$patterns[] = "/target=['"'']?([_a-zA-Z]+)['"'']?/"
我在REGEX不是最好的,但据我所知,这会为你节省一些时间。
它很可能与它们匹配,但由于<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);
干杯。
此表达式将处理3个选项:
- 无引号
- 双引号
- 单引号
'/href=["''']?([^"'''>]+)["''']?/'