PHP preg_match()或strpos检查字符串是否以子字符串开头

PHP preg_match()或strpos检查字符串是否以子字符串开头,php,regex,preg-match,Php,Regex,Preg Match,我正在根据$\u GET['code']更改页面的视图。它可以等于一系列不同的代码,但它们都将以红色、城镇或方位开头,然后是一系列字符 例如,以下所有操作都会触发该条件 RedWings-223123-NY Townmansion-2341322-KY BearingWays-23422-DC 我试过了 <?php if(preg_match("%(?=.*Bear)(?=.*Red)(?=.*Town)%", $_GET['code'])): ?> <span>

我正在根据
$\u GET['code']
更改页面的视图。它可以等于一系列不同的代码,但它们都将以
红色
城镇
方位
开头,然后是一系列字符

例如,以下所有操作都会触发该条件

RedWings-223123-NY
Townmansion-2341322-KY
BearingWays-23422-DC
我试过了

<?php if(preg_match("%(?=.*Bear)(?=.*Red)(?=.*Town)%", $_GET['code'])): ?>

   <span> new view </span>

<?php endif ?>

新观点


您的
strpos
在语法上不正确,在传递要搜索的术语之前关闭函数

您的正则表达式要求所有术语都存在,并且不检查字符串的开头。您需要使用
和前导锚点。这:

^(?:Bear|Town|Red)
我应该这样做

正则表达式演示:

正确
strpos
用法:

<?php if( strpos($_GET['code'], "Red" ) === 0 || strpos($_GET['code'], "Bear" ) === 0 || strpos($_GET['code'], "Town" === 0)): ?>

   <span>new view</span>

<?php endif ?>

新观点

您需要
0
来确认它是否匹配,否则您将检查它是否在其中的某个位置。

但它们都不起作用?
$\u GET['code']
的值是多少,请确保它是您期望的值。您的正则表达式暗示它们都应该匹配。您应该使用
(?=.*(:Bear | Town | Red))
。但老实说,
^(?:Bear | Town | Red)
的性能比使用正面正面造型要好得多。而且正则表达式似乎也不正确。但这可能有用:@chris85谢谢你。这并没有解决我的问题。@Andreas很棒的工具感谢它提供了一个很好的解释
^(?:Bear | Town | Red)
性能更好(用户只需确认匹配),这是真的,但anchor将用户指定的步骤数减少到30步(从173步减少到30步):它们都将从
Red
Town
Bearing
开始,所以我假设它们都是以这些单词开头。@chris85你能验证一下“^”是以开头的吗?“?”是可选的,是“:”是下面的,最后是“|”是或运算符。
?:
是非捕获组,
()
创建了一个不需要的捕获组。之所以需要()是因为否则
^
只会影响第一个术语。这将是相同的,
^Bear.^Town.^Red
<?php if( strpos($_GET['code'], "Red" ) === 0 || strpos($_GET['code'], "Bear" ) === 0 || strpos($_GET['code'], "Town" === 0)): ?>

   <span>new view</span>

<?php endif ?>