preg_match量词不适用于PHP 5.5

时间:2014-08-08 17:27:20

标签: php regex unicode

您好我正在尝试使用此模式/^(–*\s*2\.2\.|2\.2\.)/来匹配此字符串,每行都是不同的字符串。 编辑抱歉数据格式不佳

<?php
 $final_texts=array();
 $pattern='/^(–*\s*2\.2\.|2\.2\.)/';//this is generated automatically elsewhere btw
 $texts = array(
 "– 2.2.04 R",
 "–– 2.2.04.10 C",
 "–– 2.2.04.1 CO",
 "–– 2.2.04.2 CO",
 "–– 2.2.04.3 CO",
 "–– 2.2.04.4 CO",
 "–– 2.2.04.5 CO",
 "–– 2.2.04.6 CO",
 "–– 2.2.04.7 CO",
 "–– 2.2.04.8 CO",
 "–– 2.2.04.9 CO",
 "foooooooooooo",
 "barrrrrrrrrr",
 "-- foobar",
 "- 1123",
 );
 foreach($texts as $key=>$text){    
    if(preg_match($pattern, $text)){
        $final_texts[]=$text;
    }
  }
 print_r($final_texts); ?>

这就是我正在使用的preg_match($pattern, $string) 正如我理解它*意味着前者的0或更多,但我不是专家。

但只匹配第一个字符串而不是匹配多个字符串的字符串“ - ”请记住,它们是数组中不同的字符串,我迭代它来做某事。我应该在模式中做一些不同的事情,我试图匹配所有以 2.2。字符串开头的任何数量的破折号和空格开头的字符串。而且我将与其他数字有这个问题,并且我将来可能会有超过2个破折号的字符串所以我看不出如何解决这个问题而不使用正则表达式 我已经在这里测试http://preg_match.onlinephpfunctions.com/并遇到同样的问题。 demo感谢@hwnd给我看这个!

2 个答案:

答案 0 :(得分:3)

我相信这是你在正则表达式中放置的unicode短划线。我建议使用Unicode property \p{Pd}任何类型的连字符或短划线)来匹配这些字符。

/^(\p{Pd}+\s*2\.2\.|2\.2\.)/mu

注意: m(多行)修饰符会导致^与每行的开头匹配。 u修饰符打开PCRE的其他功能,模式字符串被视为(UTF-8)。

Working Demo

只是为了思考,而不是迭代你的数组,而不是在这里使用preg_grep()

$final_texts = preg_grep('/^(\p{Pd}+\s*2\.2\.|2\.2\.)/mu', $texts);

Working Demo

答案 1 :(得分:0)

En dash在UTF-8中编码为三个字节(E2 80 93)。量词只会应用于最后一个字节,因此–*相当于\x{e2}\x{80}\x{93}*

您可以简单地将Unicode字符包装在括号(–)*中,以将量词应用于所有三个字节。或者,如果您不想捕获它,请使用非捕获组(?:–)*

字符集也适用于Unicode字符[–]

请参阅runnable