0

我似乎无法确切地弄清楚如何从更大的块中获取我需要的特定部分文本。在解析电子邮件时,我需要能够在常规文本块中获取 a : 和 a ( 之间的字符串。下面是一个示例。我对 preg_match 有所了解,我认为这就是答案,但似乎无法让它工作。任何帮助将不胜感激,因为搜索这里和谷歌没有出现任何结果。

对于 GC3J26P:Wise Lake II(传统)

我只需要 : 和开头括号之间的文本。谢谢你的帮助。

4

3 回答 3

3

既然您说您已经尝试过但没有成功,请尝试以下操作:

$str = "For GC3J26P: Wise Lake II (Traditional)";
preg_match('/(?<=:).*(?=\()/', $str, $str);
if ($str) echo $str[0];

如果您不熟悉 REGEX 的阴暗但美丽的世界,请允许我解释一下这里发生了什么。

这都是关于模式的。我们的模式定义了在我们匹配的内容中什么是可接受的,什么是不可接受的——即捕获。

不仅如此,它甚至还说明了我们的比赛之前和进行的内容。这些分别称为后瞻断言和前瞻断言。这些断言是我们匹配点的锚点——它们对捕获的匹配本身没有贡献。

所以我们的模式翻译为:

1)在冒号后开始匹配(但不要在匹配中包含冒号)

2)然后允许并捕获任何字符(除了换行符和某些其他空格字符),零次或多次

3)匹配(但不包括)一个左括号

我们的模式就是所谓的贪婪模式。在我们的例子中,这意味着,如果您希望匹配的子字符串包含冒号或括号,这将没有问题,也不会破坏。只要有一个有效的匹配,从一些冒号开始,一直到一些左括号,一切都很好。(注意:如果需要,可以修改贪婪行为)。

REGEX 远不止于此,您要么爱它,要么恨它。如果您有兴趣,我建议您阅读它。入手后非常满足。

就这样,该睡觉了。

于 2012-07-07T23:11:33.493 回答
0

就是这样:我使用了“命名子模式”(将其命名为“名称”,但几乎可以称为任何东西)......

$str="For GC3J26P: Wise Lake II (Traditional)";
preg_match('/:(?P<name>[\S\s]+)\(/', $str, $matches);
echo $matches["name"];
于 2012-07-07T23:36:10.510 回答
0

你可以试试这个:

$string = 'For GC3J26P: Wise Lake II (Traditional)'; 

preg_match('/\:(.*?)\(/', $string, $matches); 

echo $matches[0]; // : Wise Lake II (
echo $matches[1]; // Wise Lake II
于 2012-07-07T23:25:07.397 回答