PHP中preg_match函数的正则表达式,用于出现多次字符

时间:2017-01-23 14:14:47

标签: php preg-match ereg

我想写一个正则表达式来查找"&"字符不止一次出现在字符串中。需要仅使用preg_match功能。例如,

$string ="& Test character &"; // should return true

$string =" Test character &&"; // should return true

$string - " Test character &"; // should return false

尝试了一些正则表达式,但无法获得预期的结果。

1 个答案:

答案 0 :(得分:0)

这几乎听起来像是一个家庭作业问题,所以这里有几个想法而没有完全放弃它:

  1. 假设你只需知道 if 多次出现,你可以提供一个匹配两个'&'任何之前,之间或之后的任何字符。如果表达式匹配,那么您知道至少有两个。
  2. 如果您确实需要知道有多少,请提供一个表达式,以查找单个'&'并捕获它,然后检查preg_match_all()返回的匹配数组。
  3. 更新:从海报

    添加每条评论的详细信息

    此处的代码:

    <?php
    
    $hay = 'abc&def&ghi';
    
    //approach 1 
    if (preg_match('/&.*&/', $hay)) {
        echo "There is more than one ampersand\n";
    } else {
        echo "There are no ampersands\n";
    };
    
    //approach 2
    if (preg_match_all('/&/', $hay, $matches)) {
        echo 'Ampersand count: ' . count($matches[0]) . "\n";
    } else {
        echo "There are no ampersands\n";
    };
    
    //approach 3
    if ($count = preg_match_all('/&/', $hay)) {
        echo "Ampersand count: $count\n";
    } else {
        echo "There are no ampersands\n";
    };
    

    通过调整$ hay的价值,随意进行实验。

    对于第一种方法,子表达式&#34;。*&#34;查找任何字符的零个或多个,因此整个表达式搜索两个带有零个或多个字符的&符号 - 任何(或什么都没有) - 它们之间。 (您可以在表达式的开头和结尾包含一个&#39;。*&#39;子表达式,但它不是必需的,因为preg_match()将匹配字符串中任何位置的表达式。单词,前导和尾随&#39;。*&#39;子表达式是隐含的。)

    对于第二种方法,表达式本身就是&符号。我们让preg_match_all()找到它们,然后我们看到它找到了多少。因为在这种情况下表达式只不过是一个简单的常量,而不是动态表达式,它很好地说明了为什么你可以放弃preg _ *()并简单地使用substr_count(),如下所示:

    $count = substr_count($hay, '&');
    

    或者如果你不在乎计数:

    $hasAmps = strpos($hay, '&') !== false;
    

    我还包括奖金第三种方法,这与第二种方法相同,只是我们让PHP扔掉了匹配列表。 preg_match_all()函数返回匹配的数量,因此我们可以简单地查看它以获取计数。第二种方法中的版本也有这个,但它也告诉PHP返回匹配列表。现在,在这种情况下匹配列表并不有用(你知道每个匹配只是一个&符号),但它可能在更现实的场景中有用。