preg_match_all有特殊字符

时间:2014-07-16 04:14:02

标签: php regex special-characters preg-match-all

我正在尝试对包含我要提取的多个短语的数据执行preg_match_all。

数据:

'us/Llane/Hówl' then some other text then 'us/Casey/Hówl' and so on

我想把Llane和Casey这两个名字提取成一个数组。我目前正在使用http://www.phpliveregex.com/以及我的代码本身尝试解决这个问题,但即使使用互联网上的一些优秀指南,正则表达式似乎也很难理解。据我所知,这应该有效:

preg_match_all("/us\/(.*?)\/HÓWL'/",$data,$output);

但我得到的是$ output [0]和$ output [1],它们都是空白的。我以前没有遇到过问题所以它可能是特殊字符但是我只能找到关于preg_match_all的信息来检测特殊字符,而不仅仅是在字符串中使用它们。任何帮助都会很棒,我现在已经坚持这个问题大约4天了,花了很多时间试图解决这个问题。

2 个答案:

答案 0 :(得分:2)

您尝试匹配HÓWL而不是Hówl ..

$data = "'us/Llane/Hówl' then some other text then 'us/Casey/Hówl' and so on";
preg_match_all("~us/(.*?)/Hówl~", $data, $output);
print_r($output[1]);

<强>输出

Array
(
    [0] => Llane
    [1] => Casey
)

或者,除非您知道Hówl将始终位于正斜杠的右侧,否则我会考虑使用完整的 Letter Unicode property \p{L}。这样您也可以匹配重音字符。

preg_match_all("~us/(.*?)/\p{L}+~u", $data, $output);

答案 1 :(得分:1)

案例不敏感可能无法正常工作

使用此:

$regex = '~us/\K.*?(?=/Hówl)~';
$count = preg_match_all($regex, $yourstring, $matches);
if($count) print_r($matches[0]);

比赛:

Llane
Casey

查看the demo中的匹配项。

<强>解释

  • us/匹配文字字符
  • \K告诉引擎放弃与其返回的最终匹配项目匹配的内容
  • .*?懒洋洋地匹配......
  • 前瞻(?=/Hówl)可以断言后面的内容是Hówl