Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我能';我不能正确使用正则表达式_Php_Expression_Preg Match All - Fatal编程技术网

Php 我能';我不能正确使用正则表达式

Php 我能';我不能正确使用正则表达式,php,expression,preg-match-all,Php,Expression,Preg Match All,对不起,伙计们,也许我的问题真的很傻,但我还是被正则表达式卡住了 看,我有一个变量,例如: $str = "[quote]Here I am 2013[/quote]"; $rega = preg_match_all("/[quote](.*)[quote]/i",$str,$hols); 当我尝试获取$hols变量时,我得到如下结果: $str = "[quote]Hello people this is my...[/quote]"; quote]Hello people He

对不起,伙计们,也许我的问题真的很傻,但我还是被正则表达式卡住了

看,我有一个变量,例如:

$str = "[quote]Here I am 2013[/quote]";

$rega = preg_match_all("/[quote](.*)[quote]/i",$str,$hols);
当我尝试获取$hols变量时,我得到如下结果:

$str = "[quote]Hello people

this

is

my...[/quote]";
quote]Hello people
Hello people

this

is

my...
我在这里

但我需要这样的东西:

$str = "[quote]Hello people

this

is

my...[/quote]";
quote]Hello people
Hello people

this

is

my...
我在这里

第二个问题是当我试图从$str获取时:

$str = "[quote]Hello people

this

is

my...[/quote]";
quote]Hello people
Hello people

this

is

my...
因此,通过正则表达式,我得到如下结果:

$str = "[quote]Hello people

this

is

my...[/quote]";
quote]Hello people
Hello people

this

is

my...
但我需要:

$str = "[quote]Hello people

this

is

my...[/quote]";
quote]Hello people
Hello people

this

is

my...
如果你能向我解释如何处理它,如何使它正确,我将不胜感激。因为我不知道如何修复它

preg_match_all("/[quote](.*)[quote]/i",$str,$hols);
                             ^--- missing / there
此外,您可能需要:

"/\[quote\](.*?)\[\/quote\]/mis"
要使其成为:ungreedy,匹配多行,您必须转义
[
]
,因为
[quote]
实际上定义了一个只匹配q、u、o、t和e的字符类

如果您还可以嵌套
[quote]
s,则必须避免使用正则表达式,因为嵌套不是上下文无关的。正则表达式只能处理上下文无关的语法。然后,解决方案是构建一个(非常简单的)解析器

此外,您可能需要:

"/\[quote\](.*?)\[\/quote\]/mis"
要使其成为:ungreedy,匹配多行,您必须转义
[
]
,因为
[quote]
实际上定义了一个只匹配q、u、o、t和e的字符类


如果您还可以嵌套
[quote]
s,则必须避免使用正则表达式,因为嵌套不是上下文无关的。正则表达式只能处理上下文无关的语法。然后,解决方案是构建一个(非常简单的)解析器。

除了Frits所说的,您还需要跳出括号;您当前要求正则表达式匹配任何字符“q”、“u”、“o”、“t”或“e”,后跟任何字符,然后再跟这些相同的字符;匹配如此之大的唯一原因与您的表达式贪婪有关,而弗里茨的建议将“打破”这一点(尽管是正确的)。简言之,像这样避开括号:

/\[quote\](.*?)\[\/quote\]/mis
更多说明: 考虑到您之前的模式:

/[quote](.*)[quote]/i
你要求的是:

  • 集合的任何字符[引号]
  • 除换行符以外的任何字符,零次或多次
  • 集合的任何字符[引号]
  • 因此,例如,字符串
    Queen's Charter!
    将匹配
    Queen's Charte
    ueen's Chart
    的内部匹配(因为未捕获第一个和最后一个字符类)

    如果将第二步设置为非贪婪,则得到的是根本没有内部匹配的
    Qu
    ee
    te

    编辑:回复评论 我运行了以下代码:

    preg_match_all(
        '/\[quote\](.*?)\[\/quote\]/mis',
        "[quote]A test!  A Marvelous Test![/quote]",
        $matches
    );
    
    var_dump($matches);
    
    并得到如下结果:

    array (size=2)
      0 => 
        array (size=1)
          0 => string '[quote]A test!  A Marvelous Test![/quote]' (length=41)
      1 => 
        array (size=1)
          0 => string 'A test!  A Marvelous Test!' (length=26)
    

    除了Frits所说的以外,您还需要跳出括号;您当前正在要求正则表达式匹配任何字符“q”、“u”、“o”、“t”或“e”,后跟任何字符,然后再跟这些相同的字符;匹配如此之大的唯一原因是您的表达式是贪婪的,而Frits“sugg”estion将“打破”这一点(尽管是正确的)。简言之,像这样避开括号:

    /\[quote\](.*?)\[\/quote\]/mis
    
    更多说明: 考虑到您之前的模式:

    /[quote](.*)[quote]/i
    
    你要求的是:

  • 集合的任何字符[引号]
  • 除换行符以外的任何字符,零次或多次
  • 集合的任何字符[引号]
  • 因此,例如,字符串
    Queen's Charter!
    将匹配
    Queen's Charte
    ueen's Chart
    的内部匹配(因为未捕获第一个和最后一个字符类)

    如果将第二步设置为非贪婪,则得到的是根本没有内部匹配的
    Qu
    ee
    te

    编辑:回复评论 我运行了以下代码:

    preg_match_all(
        '/\[quote\](.*?)\[\/quote\]/mis',
        "[quote]A test!  A Marvelous Test![/quote]",
        $matches
    );
    
    var_dump($matches);
    
    并得到如下结果:

    array (size=2)
      0 => 
        array (size=1)
          0 => string '[quote]A test!  A Marvelous Test![/quote]' (length=41)
      1 => 
        array (size=1)
          0 => string 'A test!  A Marvelous Test!' (length=26)
    

    很抱歉,但是您的变体不起作用,它仍然会返回smth,比如:[quote]大家好,这是我的…[/quote]和[quote]我的意思是您正在查看
    $hols[0]
    还是
    $hols[1]
    $hols[0]
    将包含完整的匹配项,即整个字符串;
    $hols[1]
    将包含子模式(括号中的部分,在引号标记之间)。有关详细信息,请参阅我最近的编辑。抱歉,但您的变体不起作用,它仍然会返回smth,如:[quote]您好!这是我的…[/quote]和[quote]我的意思是,您是否正在查看
    $hols[0]
    $hols[1]
    $hols[0]
    将包含完全匹配,即整个字符串;
    $hols[1]
    将包含子模式(括号中的部分,引号标记之间)。有关详细信息,请参阅我最近的编辑。+1表示语法分析器;从不嵌套正则表达式。如果你认为可以,则不能。这样,疯狂在于。+1表示语法分析器;从不嵌套正则表达式。如果你认为可以,则不能。这样,疯狂在于。