我需要帮助来解决这个问题。我不熟悉preg模式,所以也许这很简单:)
我的模板系统中有一个preg_replace:
$code = preg_replace('#\{([a-z0-9\-_].*?)\}#is', '\1', $code);
工作正常,但如果我有一些像这个谷歌加按钮的JavaScript代码:
window.___gcfg = {lang: 'sk'};
它取代了这一个:
window.___gcfg = ;
我尝试了这种模式:#\{([a-z0-9\-_]*?)\}#is
这适用于gplus按钮,但当我有这样的时候(谷歌的adsense代码)(adsbygoogle = window.adsbygoogle || []).push({});
结果为(adsbygoogle = window.adsbygoogle || []).push();
我需要应用类似这样的规则,但我不知道为什么它不起作用
\{([a-z0-9-_])\}
- 只需字母,数字,下划线和短划线。我还需要保留其他任何东西。
感谢您的回答。
编辑: 我需要的更简单的例子:
{SOMETHING} -> do rewrite
{A_SOMETHING} -> do rewrite
{} -> do not rewrite
{name : 'me'} -> do not rewrite
因此,如果除了a-z0-9-_之外还有其他内容,或者{}之间没有任何内容,那么就不要重写并跳过它。
答案 0 :(得分:0)
所以,看起来你想要匹配花括号,其内容只是a-z0-9_-。 在这种情况下,请尝试:
$code = preg_replace('#\{([a-z0-9\-_]+?)\}#is',
'whatever_you_wanted_to_replace_with',
$code);
您的原始正则表达式“匹配[a-z0-9_-]后跟0或更多任何内容”(.*?
)。
这个说“匹配[a-z0-9_-]
中的一个或多个”。
至于你想用替换这些东西,你还没有说清楚,所以我假设你可以做到这一点。
答案 1 :(得分:0)
您可以尝试使用模式的第一部分搜索脚本子字符串,使用第二部分搜索模板标记。脚本子字符串将由其自身替换,并且模板标记将包含其内容。
由于模式使用分支重置功能(?|...|...)
,因此捕获组具有相同的数字(即数字1)。
$pattern = '#(?|(<script\b(?>[^<]++|<(?!/script>))+</script>)|{([\w-]++)})#i';
$code = preg_replace($pattern, '$1', $code);
请注意,您可以在没有分支重置功能的情况下执行相同操作,但必须更改替换模式:
$pattern = '#(<script\b(?>[^<]++|<(?!/script>))+</script>)|{([\w-]++)}#i';
$code = preg_replace($pattern, '$1$2', $code);
另一种方法是使用回溯控制动词(*SKIP)
和(*FAIL)
来跳过脚本子串。 (*SKIP)
强制在其右侧的子模式失败时不重试子字符串(在其左侧与子模式匹配之前匹配)。 (*FAIL)
使模式立即失败:
$pattern = '#<script\b(?>[^<]++|<(?!/script>))+</script>(*SKIP)(*FAIL)|{([\w-]++)}#i';
$code = preg_replace($pattern, '$1', $code);
与两个先例模式的不同之处在于,您根本不需要在替换模式中为脚本子串提供任何引用。