繁体   English   中英

preg_match是否为网址中的特定模式?

[英]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
  1. %分隔符-告诉脚本模式从此处开始。
  2. <a寻找开始链接标签。
  3. [^>]*? 这是一个字符类[]告诉脚本查找所有不是^结束html标记>字符,并且可以进行*多次,直到到达表达式的下一部分为止? 在这种情况下,它将在找到~dead host~时停止。 这类似于项目#5,不同之处在于我们希望它匹配除封闭HTML标记之外的任何字符,而在数字#5中,它可以匹配任何字符,包括封闭HTML标记。
  4. ~dead host~查找文字串“死主机”包裹在tildas“〜”。
  5. .*? 这意味着找到任何字符. ,尽可能多地* ,直到到达表达式的下一部分? 在这种情况下,它是</a>
  6. </a>查找结束链接标记。
  7. %分隔符-告诉脚本模式在此处结束。
  8. 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM