我想写一个正则表达式来查找"&"字符不止一次出现在字符串中。需要仅使用preg_match
功能。例如,
$string ="& Test character &"; // should return true
$string =" Test character &&"; // should return true
$string - " Test character &"; // should return false
尝试了一些正则表达式,但无法获得预期的结果。
答案 0 :(得分:0)
这几乎听起来像是一个家庭作业问题,所以这里有几个想法而没有完全放弃它:
更新:从海报
添加每条评论的详细信息此处的代码:
<?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返回匹配列表。现在,在这种情况下匹配列表并不有用(你知道每个匹配只是一个&符号),但它可能在更现实的场景中有用。