我编写了这个脚本,以便能够在我的代码中使用类似bb代码的代码。花了很多时间决定最好的方法并在How to dynamically replace bb tags?询问后,我决定使用preg_replace_callback。
但是在同一行上有多个项目存在问题
Man [forvo=man,nl]
Mannen [forvo=mannen,nl]
以上部分有效,但下面没有。
Kip [forvo=kip,nl] - Kippen [forvo=kippen,nl]
Bal [forvo=bal,nl] - Ballen [forvo=ballen,nl]
Vrouw [forvo=vrouw,nl] - Vrouwen [forvo=vrouwen,nl]
我知道使用file_get_contents()不是推荐选项,但如果我想在每行使用多个Forvo-tags,我是否还应该找到preg_replace_callback的另一个解决方案?
<?php
// Replace forvos in the lesson
$lesson_body = $lesson['Lesson']['body'];
function forvize($match) {
$word = $match[1];
$language = $match[2];
$link = "http://apifree.forvo.com/action/word-pronunciations/format/js-tag/word/".$word."/language/".$language."/order/rate-desc/limit/1/key/API_KEY/";
$link = file_get_contents($link);
return $link;
}
//URL's
$lesson_body = preg_replace_callback("/\[forvo\=(.*),(.*)\]/", 'forvize', $lesson_body);
?>
答案 0 :(得分:0)
你做的错误很常见。默认情况下,FULL STOP(.
,也称为 dot )匹配除换行符之外的任何字符。所以,如果你在一行上有一个bbcode,这没问题:
/\[forvo\=(.*),(.*)\]/
但如果你在一条线上有更多的单个bbcode,那么点将尽可能多地匹配模式:
[forvo=aaaa,bbbbb] ... [forvo=cccc,dddd]
(.* ),(.*)
您可以做的是将第一个参数限制为除COMMA(,
)之外的所有字符,将第二个参数限制为所有字符,但是右方括号(]
)。
示例:
/\[forvo\=([^,]*),([^\]]*)\]/
答案 1 :(得分:0)
一种捕捉它们的方法是使用ungreedy量词(又称问号)来捕捉它,直到模式中第一次出现以下字符为止。
~\[forvo=(.*?),(.*?)\]~
另一种选择是使它捕获除特定字符之外的任何内容(在这种情况下分别为逗号和右括号)。查看@hakre的答案,看看它是如何完成的。