php - 如何使用php正则表达式
问题描述
我想从以foo 'foo arbaz luj abaz lewis*bazbazlewbaz' 开头的字符串中计算星号,我应该能够从另一个以luja开头的字符串中计算星号。简而言之,我希望以编程方式更改起始字符串
我尝试了下面的代码,但即使foo不在开头,它也会计算任何星号
preg_match_all('/(^foo\*)*(\*)/', '*foo*arbaz*luj*abaz*lewis*bazbazlewbaz');
结果是6。但在这种情况下,我希望它失败,因为foo不是在开始。
解决方案
它不是正则表达式的最佳应用程序,但您可以使用
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 演示。
推荐阅读
- java - 我在surfaceView的帮助下制作了一个视频播放器应用程序
- nestjs - NestJS 服务中的自定义 TypeORM 错误
- python - 使不同的线程循环
- bash - 基于值的动态变量名称
- ffmpeg - 视频关键帧和 iframe
- android-studio - 减少 gradle daemon 磁盘空间(最多占用 50GB)
- java - 跨不同 Spring 项目的多个 JPA 存储库到同一实体
- dataweave - Mule 4:Dataweave:如何过滤和更新列表中的匹配对象?
- django - 如何创建 Django 自定义管理页面?(不覆盖列表或对象页面)
- reactjs - 通过 hookrouter 传递额外的道具