首页 > 解决方案 > 如何使用php正则表达式

问题描述

我想从以foo 'foo arbaz luj abaz lewis*bazbazlewbaz' 开头的字符串中计算星号,我应该能够从另一个以luja开头的字符串中计算星号。简而言之,我希望以编程方式更改起始字符串

我尝试了下面的代码,但即使foo不在开头,它也会计算任何星号

preg_match_all('/(^foo\*)*(\*)/', '*foo*arbaz*luj*abaz*lewis*bazbazlewbaz'); 

结果是6。但在这种情况下,我希望它失败,因为foo不是在开始。

标签: phpregexstring

解决方案


它不是正则表达式的最佳应用程序,但您可以使用

preg_match_all('~(?:\G(?!\A)|^foo)[^*]*\K\*~', $string, $matches)

请参阅正则表达式演示详情

  • (?:\G(?!\A)|^foo)- 上一个成功匹配的结尾或foo字符串的开头
  • [^*]*- 零个或多个字符*
  • \K- 丢弃目前匹配的文本
  • \*- 一个星号。

查看PHP 演示

$string = "foo*arbaz*luj*abaz*lewis*bazbazlewbaz";
echo preg_match_all('~(?:\G(?!\A)|^foo)[^*]*\K\*~', $string, $matches);
// => 5

如果没有正则表达式,您可以简单地检查是否foo出现在字符串的开头(使用strpos),然后使用substr_count来计算星号的出现:

$string = "foo*arbaz*luj*abaz*lewis*bazbazlewbaz";
if (strpos($string, "foo") === 0 ) {
    echo substr_count($string, "*");
}

请参阅此 PHP 演示


推荐阅读