如何将文本中的确切域链接与正则表达式匹配,如“telegram.org”等,但不匹配“telegram.org/”子类别

时间:2017-07-31 14:15:44

标签: php regex

我在php中使用preg_match()函数来查找字符串内的匹配。

**$var="you can find in telegram.org/";
if(preg_match("(?=(?!(telegram\.org).*)",&var)>0)
{
   echo "ok";
}else{
 echo "fault";
}**

我想打印错误。

2 个答案:

答案 0 :(得分:2)

好像你可以使用

if (preg_match('~^(?!.*telegram\.org/).*telegram\.org~', $var)) {
    echo "OK";
}

请参阅regex demo

此模式将匹配包含telegram.org但不包含telegram.org/的任何字符串。

<强>详情

  • ^ - 字符串开头
  • (?!.*telegram\.org/) - 字符串中的任何位置都不允许telegram.org/
  • .* - 除了换行符之外的任何0 +字符
  • telegram\.org - telegram.org子字符串。

注意如果您希望将telegram.org作为整个词匹配,则需要正则表达式:

'~^(?!.*\btelegram\.org/).*\btelegram\.org\b~'

检查\b,字边界。否则,您可能会考虑其他非正则表达式来匹配字符串。与the one below类似,但是 - 或许更好 - with stripos,用于不区分大小写的比较。

答案 1 :(得分:1)

我建议不要使用正则表达式。 strpos()很快,可以很好地完成这项任务。

这是demo,只需要拨打strpos()两次:

$vars=["you can find in telegram.org/","you can find in telegram.org","telegram.org here"];
$find='telegram.org';
foreach($vars as $var){
    if(strpos($var,$find)!==false && strpos($var,$find.'/')===false){
        echo "$find found without /\n";
    }else{
        echo "$find failed\n";
    }
}

输出:

telegram.org failed
telegram.org found without /
telegram.org found without /

如果您使用正则表达式,我认为~telegram\.org(?!/)~可以很好地完成工作。只需检查字符串,看看它后面没有/