简单的RegEx PHP

时间:2009-06-17 18:27:21

标签: php regex

我有一个字符串,我需要查看它是否包含以下“_archived”。

我使用以下内容:

preg_match('(.*)_archived$',$string);

但得到:

Warning: preg_match() [function.preg-match]: Unknown modifier '_' in /home/storrec/classes/class.main.php on line 70

我是正则表达式的新手,所以这可能很容易。

或者我应该使用更简单的东西,比如

strstr($string, "_archived");

提前致谢

9 个答案:

答案 0 :(得分:7)

strstr($ string,“_ cherived”);

对于你描述的问题会更容易。

经常被引用

  

有些人在面对问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。 - 杰米·扎温斯基

答案 1 :(得分:6)

在这种情况下, strstr已足够,但要解决您的问题,您需要在正则表达式中添加分隔符。分隔符是一个特殊字符,用于启动和结束正则表达式,如下所示:

preg_match('/_archived/',$string);

分隔符可以是很多不同的字符,但通常的选择是/,#和!。从PHP手册:

  

任何字符都可以用于分隔符,只要它不是字母数字,反斜杠()或空字节。如果必须在表达式本身中使用分隔符,则需要使用反斜杠进行转义。从PHP 4.0.4开始,您还可以使用Perl-style(),{},[]和<>匹配分隔符。

阅读有关PHP正则表达式语法here的所有内容。

您可以在PHP manual here中看到一些有效(和无效)模式的示例。

答案 2 :(得分:1)

你只需要一些分隔符,例如用/

括起模式
preg_match('/_archived$/',$string);

Perl正则表达式允许您使用任何分隔符,如果您的正则表达式使用/很多,这是很方便的。我经常发现自己使用大括号,例如:

preg_match('{_archived$}',$string);

另外,请注意,您不需要(。*)位,因为您没有在“_archived”之前捕获该位,您只是在测试以查看字符串是否以它结尾(该符号位于end匹配字符串的结尾)

答案 3 :(得分:1)

如果您要查找的是字符串是否包含字符串,那么请务必使用简单版本。但你也可以这样做:

preg_match('/_archived/', $string);

答案 4 :(得分:0)

尝试:

preg_match('/(.*)_archived$/',$string);

如果你只检查字符串是否存在于$ string中,那么strstr应该足够了。

答案 5 :(得分:0)

我想,

strstr()或strpos()会更好地找到这样的东西。您得到的错误是由于您的正则表达式周围没有任何分隔符。尝试使用

"/(.*)_archived$/"

"#(.*)_archived$#".

答案 6 :(得分:0)

......可能是实现这一目标的最佳方式。你是正确的,正则表达式是矫枉过正。

答案 7 :(得分:0)

当你有一个特定的字符串,你正在寻找,使用正则表达式有点矫枉过正。你可以在这里使用PHP的标准字符串搜索功能之一。

strstr函数可以工作,但传统的PHP Wisdom(读作:myth,legend,superstition,the manual)表示使用strpos函数会产生更好的性能。即,像

if(strpos($string, '_archived') !== false) {
}

你会想在这里使用真正的不等式运算符,因为strpos在它的大海捞针开头找到一个针时会返回“0”。有关详细信息,请参阅the manual

关于你的问题,PHP的正则表达式引擎要求你用一组分隔符包围你的正则表达式字符串,分隔符可以是许多不同字符之一(“/”或“|”或“(”或“) {“或”#“或者......)。PHP引擎认为你想要一个正则表达式

.*

带有一组

的模式修饰符
_archived$

因此,将来,当您使用正则表达式时,请尝试类似

的内容
//equivilant
preg_match('/(.*)_archived$/i',$string);
preg_match('{(.*)_archived$}i',$string);
preg_match('#(.*)_archived$#i',$string);

“/”,“#”和“{}”字符是您的分隔符。它们不用于匹配,它们用于告诉引擎“这些字符之间的任何内容都是我的注册表。最后的”i“是一个模式修饰符,表示不区分大小写。这没有必要,但是我把它包含在这里,这样你就可以看到模式修饰符的样子,并帮助你理解你为什么需要分隔符。

答案 8 :(得分:0)

如果您使用T-Regx

,则不必记住分隔符
pattern('_archived$')->matches($string)