我的正则表达式有什么问题?

时间:2011-10-19 20:41:02

标签: php regex

我需要从下面的行中获得这些部分:Jony,Smith和example-free@wpdevelop.com

,正如您所看到的,它们位于^和〜之间。

text^name1^Jony~text^secondname1^Smith~text^email1^example-free@wpdevelop.com~

这样做我试过了:

preg_match_all ('/\^(.*?)\~/', $row['form'], $res);

对于显示的名称: ^ name1 ^ Jony~ 对于第二个名称: ^ secondname1 ^ Smith~ 和电子邮件: ^email1^example-free@wpdevelop.com!

正如你所看到的,“text”这个词已经消失了,但不是^,name1,secondname1,email1和〜

你能说出我正则表达中的错误吗?

3 个答案:

答案 0 :(得分:3)

.*更改为[^^]*,意思是“任何字符不包括 ^

<?php
$str = 'text^name1^Jony~text^secondname1^Smith~text^email1^example-free@wpdevelop.com~';

preg_match_all ('/\^([^^]*?)\~/', $str, $res);

var_dump($res);

/*
//output 

$ php scratch.php
array(2) {
  [0]=>
  array(3) {
    [0]=>
    string(6) "^Jony~"
    [1]=>
    string(7) "^Smith~"
    [2]=>
    string(28) "^example-free@wpdevelop.com~"
  }
  [1]=>
  array(3) {
    [0]=>
    string(4) "Jony"
    [1]=>
    string(5) "Smith"
    [2]=>
    string(26) "example-free@wpdevelop.com"
  }
}
*/

答案 1 :(得分:1)

您的正则表达式必须为'/\^([^\^]*?)\~/',您使用的是.,后者会选择^。您无需使用^而不是[^\^]选择.

答案 2 :(得分:1)

这样更好:

<?php

$string = 'text^name1^Jony~text^secondname1^Smith~text^email1^example-free@wpdevelop.com~';

preg_match_all('/\^.+?\^(.+?)~/', $string, $matches);

var_dump($matches);

$ match中的结果将是:

array(2) {
  [0]=>
  array(3) {
    [0]=>
    string(12) "^name1^Jony~"
    [1]=>
    string(19) "^secondname1^Smith~"
    [2]=>
    string(35) "^email1^example-free@wpdevelop.com~"
  }
  [1]=>
  array(3) {
    [0]=>
    string(4) "Jony"
    [1]=>
    string(5) "Smith"
    [2]=>
    string(26) "example-free@wpdevelop.com"
  }
}

我将此。+?\ ^部分添加到正则表达式中,它匹配两个^字符之间的文本。