使用正则表达式查找最多16个字符的短语? (PHP)

时间:2013-04-02 00:12:47

标签: php regex string

我面临的小问题。我有一个很长的字符串,里面有很多单词,而我正在尝试将其拆分,但是字符串的大多数部分都有一个开始和结束来引用它是静态的,但是这个只有一个结尾,我想要获得的字符串的实际位是动态的,但它最多可达16个字符,可能会更少,并且短语中的单词数量是未知的。

示例:

Name: John Smith Occupation: Doctor Currently Busy Gender: Male 

我希望自己获得“当前忙碌”而不会在之前获得另一个字符串的结尾。

但是我也希望使用相同的代码从这个字符串中获取“Not Yet Here”:

Name: John Smith Occupation: Doctor Not Yet Here Gender: Male 

我找不到方法,我甚至不知道是否有可能,所以希望有人可以帮助我。

2 个答案:

答案 0 :(得分:1)

您的问题是RegEx可能无法解决的问题。如果“职业”的值可以是一个或多个单词,并且它直接由另一个可能是一个或多个单词的值继承,那么你如何将这两个短语分开,作为一个人呢?

我希望至少你有一套已知的Occupation值。如果是这种情况,那么您可以像这样制作表达式:

(?<=Doctor |Nurse ).*(?= Gender)

(?<=...)(?=...)位是lookbehind和lookahead断言,基本上说“确保表达式Doctor |Nurse出现在匹配的短语之前(但不匹配它的那一部分) ,并且表达式Gender出现在匹配的短语之后(但也与它的那部分不匹配)。“

请参阅此操作:http://regexr.com?34buq

答案 1 :(得分:0)

不是最优雅的方式,但这是一个解决方案:

$string = 'Name: John Smith Occupation: Doctor Currently Busy Gender: Male';
$groups = array_filter(preg_split('/\s?\w+:\s?/', $string));
// Split by [\s? => optional space][\w+ => characters a-zA-Z0-9_][:][\s? => optional space]

// $groups[2] contains 'Doctor Currently Busy'
$pieces = explode(' ', $groups[2]);
$pieces = array_reverse($pieces);
$length = 0;$i = 0;$c = count($pieces);$result = array(); // We need this for the loop
// $c and $i are to preserve the first word if the length of all words are < 16 !

foreach($pieces as $piece){
    $length += strlen($piece);
    $i++;
    if($length <= 16 && $c != $i){
        $result[] = $piece;
    }else{
        break;
    }
}

$result = array_reverse($result);
$final_result = implode(' ', $result);
echo $final_result; // Currently Busy