使用多个模式的php preg_match

4

我有两个模式,希望能在一个字符串中搜索它们。 它们的样子像这样:

$pattern = '/,3$/'
$pattern = '/^1,/';

实际上,我想找到以 1, 开头或以 ,3 结尾的字符串。

我的字符串格式如下:

a => 1,2
b => 31,2
c => 4,3

例如,a和c是匹配的!
如何使用preg_match检查这些模式?
感谢帮助。

循环遍历它们并进行匹配。 - Sougata Bose
1
我正在寻找一种仅需一次检查的方法...! - Masoud Nazari
你需要匹配什么?你需要检查字符串是否以1开头,或者以3结尾,还是需要提取除此之外的所有内容?如果你只需要匹配,可以使用或运算符|。否则,如果你需要匹配剩下的部分,可以使用类似这样的表达式:(?=^1,(.*?)$)|(?=(.*?),3$) - briosheje
我想进行检查,但是我不知道如何使用OR运算符。 - Masoud Nazari
@MasoudNazari: 那就只是这样:(^1,)|(,3$) 在这里测试:https://regex101.com/r/sP8bT8/1 .. ^1, 断言字符串以1开头,字面上。如果不是,则检查它是否以,3结尾。 - briosheje
3个回答

7

这样尝试一下

preg_match("/^1,|,3$/", $string)

1
你需要使用 preg_match_all,因为 match 只会找到第一个。 - Avinash Raj
2
@AvinashRaj 不,这里并不重要。它是关于匹配多个模式,而不是获得多少结果。在这种情况下,将返回与两个模式之一匹配的第一个结果。这就是 OP 想要的。 - Marki

3

/(^1,)|(,3$)/ 对你来说应该可行。


2

万一你有一天需要一个非正则表达式的解决方案,可以使用以下 startswith 和 endswith 函数

function startsWith($haystack, $needle) {
        // search backwards starting from haystack length characters from the end
        return $needle === "" || strrpos($haystack, $needle, -strlen($haystack)) !== FALSE;
    }
function endsWith($haystack, $needle) {
        // search forward starting from end minus needle length characters
        return $needle === "" || (($temp = strlen($haystack) - strlen($needle)) >= 0 && strpos($haystack, $needle, $temp) !== FALSE);
    }

if (startsWith("1,2", "1,") || endsWith("1,2", ",3"))
 echo "True1". "\n";
if (startsWith("31,2", "1,") || endsWith("31,2",",3"))
 echo "True2". "\n";
if (startsWith("4,3", "1,") || endsWith("4,3",",3"))
 echo "True3" . "\n";

IDEONE演示的输出结果如下:

True1
True3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接