作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我又一次被正则表达式困住了。没有任何好的资料可以学习更高级的用法。
我正在尝试匹配 [image width="740"height="249"parameters=""]51lca7dn56.jpg[/image]
$cache->image_tag("$4", $1, $2, "$3")
.
如果所有 [image] 参数都存在,一切都会很好,但我需要它匹配,即使缺少某些东西。例如 [image width="740"]51lca7dn56.jpg[/image]
。
当前代码是:
$text = preg_replace('#\[image width=\"(.*?)\" height=\"(.*?)\" parameters=\"(.*?)\"\](.*?)\[/image\]#e', '$cache->image_tag("$4", $1, $2, "$3")', $text);
正则表达式是唯一总是让我卡住的东西,所以如果有人也可以推荐一些好的资源,这样我就可以自己处理这些类型的问题,我将不胜感激。
我的虚拟版本是这样的:
// match only [image]
$text = preg_replace('#\[image\](.*?)\[/image\]#si', '$cache->image_tag("$1", 0, 0, "")', $text);
// match only width
$text = preg_replace('#\[image width=\"(.*?)\"\](.*?)\[/image\]#si', '$cache->image_tag("$2", $1, 0, "")', $text);
// match only width and height
$text = preg_replace('#\[image width=\"(.*?)\" height=\"(.*?)\"\](.*?)\[/image\]#si', '$cache->image_tag("$3", $1, $2, "")', $text);
// match only all
$text = preg_replace('#\[image width=\"(.*?)\" height=\"(.*?)\" parameters=\"(.*?)\"\](.*?)\[/image\]#si', '$cache->image_tag("$4", $1, $2, $3)', $text);
(这段代码实际上并没有像预期的那样工作,但你会更好地理解我的观点。)我希望基本上把所有这些可怕的困惑都放在一个 RE 调用中。
根据 Ωmega 的回答测试并运行的最终代码:
// Match: [image width="740" height="249" parameters="bw"]51lca7dn56.jpg[/image]
$text = preg_replace('#\[image\b(?=(?:[^\]]*\bwidth="(\d+)"|))(?=(?:[^\]]*\bheight="(\d+)"|))(?=(?:[^\]]*\bparameters="([^"]+)"|))[^\]]*\]([^\[]*)\[\/image\]#si', '$cache->image_tag("$4", $1, $2, "$3")', $text); // the end is #si, so it would be eaiser to debug, in reality its #e
但是,如果宽度或高度可能不存在,它将返回空而不是 NULL。所以我采纳了 preg_replace_callback()
的想法:
$text = preg_replace_callback('#\[image\b(?=(?:[^\]]*\bwidth="(\d+)"|))(?=(?:[^\]]*\bheight="(\d+)"|))(?=(?:[^\]]*\bparameters="([^"]+)"|))[^\]]*\]([^\[]*)\[\/image\]#', create_function(
'$matches',
'global $cache; return $cache->image_tag($matches[4], ($matches[1] ? $matches[1] : 0), ($matches[2] ? $matches[2] : 0), $matches[3]);'), $text);
最佳答案
也许可以试试像这样的正则表达式,它会尝试在图像标签(如果有的话)中获取额外的参数。这样,参数可以按任何顺序排列,包括和省略参数的任意组合:
$string = 'this is some code and it has bbcode in it like [image width="740" height="249" parameters=""]51lca7dn56.jpg[/image] for example.';
if (preg_match('/\[image([^\]]*)\](.*?)\[\/image\]/i', $string, $match)) {
var_dump($match);
}
结果匹配:
array(3) {
[0]=>
string(68) "[image width="740" height="249" parameters=""]51lca7dn56.jpg[/image]"
[1]=>
string(39) " width="740" height="249" parameters="""
[2]=>
string(14) "51lca7dn56.jpg"
}
因此您可以检查 $match[1]
并解析出参数。您可能需要使用 preg_replace_callback
在回调中实现逻辑。
希望对您有所帮助。
关于php - 如何在 RE 中匹配这个特定的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11679748/
我是一名优秀的程序员,十分优秀!