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 ?>