【问题标题】:Match multiple strings匹配多个字符串
【发布时间】:2017-11-03 20:04:53
【问题描述】:

我正在尝试查看 2 个字符串是否匹配。

example: 1234.5678.9012.3456 => 5678.1234.3456 = match 

这匹配是因为第二个数字字符串也在第一个字符串中。我用以下代码做到了这一点:

<?php
$haystack =  '1234.5678.9012.3456';
$needle = '5678.1234.3456';
$regex = '/(?=.*'. str_replace(".",")(?=.*",$needle) .').*$/'; 
    // regex looks like this /(?=.*5678)(?=.*1234)(?=.*3456).*$/

if(preg_match($regex, $haystack)){
    echo "A match was found.";
} else {
    echo "A match was not found.";
}
?>

这是我的问题,当有重复的数字时。

example: 1234.5678.9012.3456 => 5678.5678.3456 = dont match 
         1234.5678.5678.3456 => 5678.5678.3456 = match 

第一个示例不匹配,因为 5678 出现了两次,但第一个字符串只有一次 5678。在第二个示例中,5678 也出现了两次,因此与第二个字符串匹配。

我的问题:如何更改我的正则表达式,

【问题讨论】:

  • strpos 还不够吗?
  • 不使用正则表达式,而是使用split()将每个字符串拆分为一个字符串数组,然后使用array_diff()检查第二个中的所有内容是否都在第一个中。

标签: php regex preg-match


【解决方案1】:

试试这个:

<?php
$haystack =  '1234.5678.9012.3456';
$needle = '5678.5678.3456';

$needle_array = explode(".", $needle);
//print_r($needle_array);

$haystack_array = explode(".", $haystack);
//print_r($haystack_array);

$intersect = array_intersect($needle_array, $haystack_array);
//print_r($intersect);

if(count($intersect) > 0){
    echo "Match";
} else {
    echo "Doesn't match";
}
?>

【讨论】:

  • 交点不为空的事实并不能证明针数组的所有元素都在这个交点中。但是,您可以将交集与针数组进行比较,而不是计算交集中的元素数量。
  • 感谢@CasimiretHippolyte。他想要这个:1234.5678.9012.3456 => 5678.5678.3456 返回一个匹配。
【解决方案2】:

您选择了一种非常复杂的方法来做到这一点。您可以使用array_diff 以更简单的方式检查您想要的内容:

var_dump(array_diff(explode('.', $needle), explode('.', $haystack)));

当结果数组为空时,条件为真。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    • 2010-12-15
    • 2017-07-11
    • 2018-01-24
    • 1970-01-01
    相关资源
    最近更新 更多