我似乎无法弄清楚如何从更大的块中获取我需要的文本的某一部分。我需要能够在:和a之间获取一个字符串(在解析电子邮件时在常规文本块中。下面是一个例子。我对preg_match有点了解,我认为这是答案,但看起来似乎不大为了让它能够发挥作用。任何帮助都会受到赞赏,因为这里的搜索和谷歌没有任何结果。
对于GC3J26P:Wise Lake II(传统)
我只需要:和开头括号之间的文字。谢谢你的帮助。
答案 0 :(得分:3)
既然你说你已经尝试过并且没有成功,那就试试这个:
$str = "For GC3J26P: Wise Lake II (Traditional)";
preg_match('/(?<=:).*(?=\()/', $str, $str);
if ($str) echo $str[0];
如果你对REGEX这个阴暗但美丽的世界不熟悉,请允许我解释一下这里发生了什么。
一切都与模式有关。我们的模式定义了我们匹配的东西是什么,也是不可接受的 - 即捕获。
除此之外,它甚至还说明了应该立即进行的比赛并进行比赛。这些分别称为look-behind和look-ahead断言。这些断言是我们匹配点的锚点 - 它们对捕获的匹配本身没有贡献。
所以我们的模式翻译为:
1)在冒号后开始匹配(但在匹配中不包括冒号)
2)然后允许并捕获任何字符(禁止换行符和某些其他空格字符),零次或多次
3)匹配(但不包括)开场括号
我们的模式就是所谓的贪婪。在我们的例子中,这意味着,如果您希望匹配的子字符串本身包含冒号或括号,这将没有问题,并且不会破坏事物。只要有一个有效的匹配可用从一些冒号开始,直到一些开放括号,一切都很好。 (注意:如果需要,可以修改贪婪行为。)
REGEX还有很多,你要么爱它又恨它。如果您有兴趣,我建议您阅读。一旦你进入它,它会非常令人满意。
有了它,这是睡觉时间。
答案 1 :(得分:0)
你可以试试这个:
$string = 'For GC3J26P: Wise Lake II (Traditional)';
preg_match('/\:(.*?)\(/', $string, $matches);
echo $matches[0]; // : Wise Lake II (
echo $matches[1]; // Wise Lake II
答案 2 :(得分:0)
这是: 我使用了'命名子模式'(将其命名为“name”,但几乎可以调用任何东西)...
$str="For GC3J26P: Wise Lake II (Traditional)";
preg_match('/:(?P<name>[\S\s]+)\(/', $str, $matches);
echo $matches["name"];