[英]preg_match for a specific pattern in a url?
我想在PHP中使用preg_match
来测试URL的格式。 该URL如下所示:
<a href='http://~dead host~/vypdye57f25o' rel='nofollow' target='blank'>part-2</a>
老实说,我不知道preg_match
创建,但我的目标是
以<a href= contain word ~dead host~ end with </a>
以<a href= contain word ~dead host~ end with </a>
的模式
我尝试将字符串包含在php本机函数中,但不幸的是它并不聪明,因此我认为preg_match
是唯一的选择。
对于您的文字是什么样,以及您想要与之匹配的内容,我还是不太清楚,但是我会尽力尝试使它正确。
基本上,我在这里做的是寻找一个开放的链接标记<a
,其次是一些东西(除了关闭HTML标记的任何东西),然后输入文本dead host
裹在tildas ~
。 然后是其他内容,然后是结束链接标记</a>
。
$string = "<a href='http://~dead host~/vypdye57f25o' rel='nofollow' target='blank'>part-2</a>";
if (preg_match('%<a[^>]*?~dead host~.*?</a>%i', $string)) {
print "Circle up the wagons - a match was found!";
}
else {
print "Let's pitch camp here - no match was found!";
}
这是REGEX的说明:
% <a [^>]*? ~dead host~ .*? </a> % i
^ ^ ^ ^ ^ ^ ^ ^
1 2 3 4 5 6 7 8
%
分隔符-告诉脚本模式从此处开始。 <a
寻找开始链接标签。 [^>]*?
这是一个字符类[]
告诉脚本查找所有不是^
结束html标记>
字符,并且可以进行*
多次,直到到达表达式的下一部分为止?
。 在这种情况下,它将在找到~dead host~
时停止。 这类似于项目#5,不同之处在于我们希望它匹配除封闭HTML标记之外的任何字符,而在数字#5中,它可以匹配任何字符,包括封闭HTML标记。 ~dead host~
查找文字串“死主机”包裹在tildas“〜”。 .*?
这意味着找到任何字符.
,尽可能多地*
,直到到达表达式的下一部分?
。 在这种情况下,它是</a>
。 </a>
查找结束链接标记。 %
分隔符-告诉脚本模式在此处结束。 i
模式修改器-告诉脚本忽略大小写。 如果要搜索多行而不是仅搜索一行,则可能还需要添加ms
标志。 因此,您的模式修饰符不是这样: i
,而是这样: ims
。 尽管从技术上讲这不是正确的,但一般来说,即使您有多行,也可以将文本视为一行。 希望这是您想要的。 如果我不了解您要寻找的东西,请告诉我,我可以进行编辑以对其进行调整以使您得到想要的东西。
编辑:
为了回应您的评论,您可以使用preg_replace
而不是preg_match
来替换内容。
$string = "
<a href='http://~dead host~/vypdye57f25o' rel='nofollow' target='blank'>part-2</a><a href='http://stackoverflow.com' rel='nofollow' target='blank'>part-2</a><a href='http://stackoverflow.com' rel='nofollow' target='blank'>part-2</a><a href='http://stackoverflow.com' rel='nofollow' target='blank'>part-2</a><a href='http://stackoverflow.com' rel='nofollow' target='blank'>part-2</a><a href='http://~dead host~/vypdye57f25o' rel='nofollow' target='blank'>part-2</a><a href='http://~dead host~/vypdye57f25o' rel='nofollow' target='blank'>part-2</a><a href='http://~dead host~/vypdye57f25o' rel='nofollow' target='blank'>part-2</a><a href='http://~dead host~/vypdye57f25o' rel='nofollow' target='blank'>part-2</a><a href='http://~dead host~/vypdye57f25o' rel='nofollow' target='blank'>part-2</a>
<a href='http://stackoverflow.com' rel='nofollow' target='blank'>part-2</a><a href='http://~dead host~/vypdye57f25o' rel='nofollow' target='blank'>part-2</a><a href='http://~dead host~/vypdye57f25o' rel='nofollow' target='blank'>part-2</a><a href='http://~dead host~/vypdye57f25o' rel='nofollow' target='blank'>part-2</a><a href='http://~dead host~/vypdye57f25o' rel='nofollow' target='blank'>part-2</a><a href='http://~dead host~/vypdye57f25o' rel='nofollow' target='blank'>part-2</a><a href='http://~dead host~/vypdye57f25o' rel='nofollow' target='blank'>part-2</a>
<a href='http://stackoverflow.com' rel='nofollow' target='blank'>part-2</a><a href='http://stackoverflow.com' rel='nofollow' target='blank'>part-2</a><a href='http://~dead host~/vypdye57f25o' rel='nofollow' target='blank'>part-2</a>
";
$string = preg_replace('%<a[^>]*?~dead host~.*?</a>%i', ' ', $string);
print $string;
这会将所有匹配项替换为一个空格,而不仅仅是匹配它们。
如果您只想匹配网址
$text="<a href='http://~dead host~/vypdye57f25o' rel='nofollow' target='blank'>part-2</a>";
preg_match_all("/http:\/\/ ## starting from http://
~dead\shost~ ## along with http:// match ~dead host~
[^\"'] ## upto singlequote or doublequote
+ ## one more character
/mx",$text,$matches); // m - multiple line x - include to commentary inside patterns
print_r($matches);
工作演示
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.