如何在PHP中使用正则表达式提取部件?

时间:2010-11-19 18:29:44

标签: php regex

例如,您有以下字符串:

$text = "word1:text1@atpart/foo/do/myfood$textfinal";

该功能将起作用:

$parts = array();    
extract( $regular_exp, $text, $parts );

在parts数组中,我们将得到:

$parts[0] = "word1";
$parts[1] = "text1";
$parts[2] = "atpart";
$parts[3] = "/foo/do/myfood";
$parts[4] = "textfinal";

谢谢!

4 个答案:

答案 0 :(得分:4)

这可能不是您所追求的,但您显示的格式看起来几乎就像前面有username:password@domain身份验证的网址。如果您可以将最后$作为?投放,则可能可以使用parse_url()来解析它。

$string =  "word1:text1@atpart/foo/do/myfood?textfinal"; // notice the ?

$string = "none://".$string; // We need to add a protocol for this to work

print_r (parse_url($string));

结果:

Array ( 
         [scheme] => none 
         [host] => atpart 
         [user] => word1 
         [pass] => text1 
         [path] => /foo/do/myfood 
         [query] => textfinal )

这样做的好处是,如果输入数据中可能缺少一个或多个部分,则它非常灵活。如果这不是问题,那么正则表达式可能更方便。

答案 1 :(得分:2)

$parts = preg_split('/[:@\$]+/', $text);

答案 2 :(得分:0)

没有更多详细信息,这与提议的示例匹配:

preg_match('#(.*?):(.*?)@(.*?)(/.*?)\$(.*)#', $text, $parts);

请注意,您将获得从索引1开始而不是0的部分。

答案 3 :(得分:0)

$delims=':@$';
$word = strtok('word1:text1@atpart/foo/do/myfood$textfinal',$delims);
while ( $word!==false ) {
    foreach( explode('/',$word,2) as $tmp){
        $words[]=$tmp;
    }
    $word = strtok($delims);
}
var_dump($words);

一方面,这可能是矫枉过正。另一方面,根据字符串的不同,这可能会更灵活。

演示:http://codepad.org/vy5b9yX7

文档:http://php.net/strtok