我尝试将精确的UA标记与curl和preg_match匹配 这是我的代码
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://symfony.com');
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_USERAGENT, 'UA checker');
$result = curl_exec($ch);
curl_close($ch);
$chaine = "UA-89393-6;
Chaine是用户在DB中输入的UA标记。</ p>
preg_match('~\b'.$chaine.'\b~', $result);
UA-89393-5返回false
UA-8939返回虚假
UA-89393-返回true
UA-89393返回true
我的正则表达式有问题吗? 如何在破折号后找到UA字符串的完全匹配?
答案 0 :(得分:0)
Chaine是用户在DB中输入的UA标记。</ p>
如果您要查找用户输入的标记的完全匹配,请不要使用正则表达式。只需使用strpos()
:
if (strpos($result, $chaine) !== false) {
// found it
}
答案 1 :(得分:0)
Alex给出了最好的解决方案。这不一定是使用正则表达式的好地方,但它并不意味着它是不可能的。正则表达式不适合这种情况的原因是由于理想情况下需要多个正则表达式(或者问题的动态性质,需要单独解析两个字符串)。
但是,由于您正在寻找基于正则表达式的解决方案,我决定提出一些 正则表达式hackery 。此方法要求您在唯一分隔符的任一侧连接两个UA代码,这些代码不会显示在UA代码中。为简单起见,我选择了||
。
以下是我用于解析UA代码并确保它们根据您的规范匹配的正则表达式。
假设$ chaine = UA-00000000-1
UA-00000000-0返回false
UA-0000000返回false
UA-00000000-返回true
UA-00000000返回true
注意:如果要使用换行符来分隔多行,请确保使用g
和m
修饰符。
假设您的代码最简单......
$chaine = 'UA-00000000-1';
$match = 'UA-00000000'; // or any other value
$delimiter = '||';
$string = "{$chaine}{$delimiter}{$match}";
// perform regex match against the above $string
^(UA-\d+)(-)(\d+)\|\|\1\2?((?=\3).*)?$
UA-
后跟一个无限数字-
||
Here是用于连接字符串的正则表达式的一个示例。