php preg_replace字符串提取

时间:2011-05-04 14:02:28

标签: php regex

原始正则表达式:

$str = '"foo" <bar@baz.com>';
preg_replace('/\s(<.*?>)|"/', '', $str);

我想提取以下内容:

"foo" <bar@baz.com> extract only => foo
<bar@baz.com>       extract only => <bar@baz.com>
"" <bar@baz.com>    extract only => <bar@baz.com>

由于

2 个答案:

答案 0 :(得分:3)

好的,所以看起来你想获取一个值,而不是替换一个值,所以你应该使用preg_match,而不是preg_replace(虽然从技术上讲你可以以圆周方式使用preg_replace ...)

preg_match('~(?:"([^"]*)")?\s*(.*)~',$str,$match);
$var = ($match[1])? $match[1] : $match[2];

答案 1 :(得分:0)

进行替换时,您需要在引号内部使用某些内容。

$str = '"foo" <bar@baz.com>';
preg_replace('/"([^"]+)"\s(<.*?>)/', '$1', $str);
preg_replace('/""\s(<.*?>)/', '$1', $str);

试试吧。如果之前没有引用的名称,它应该单独留下地址。

修改:根据您的新示例输入和输出,试试这个:

$str = '"foo" <bar@baz.com>';
preg_replace('/"([^"]+)"\s(<.*?>)/', '$1', $str);
preg_replace('/(?:""\s)?(<.*?>)/', '$1', $str);

它应具有以下输入/输出结果:

"foo" <bar@baz.com>  -> foo
"" <bar@baz.com>     -> <bar@baz.com>
<bar@baz.com>        -> <bar@baz.com>