删除占位符,除非它在括号之间包含某些内容

时间:2013-05-28 20:38:24

标签: php regex

我有一个基本的模板类,用数据替换占位符,但是如果占位符没有被替换,我用空字符串替换它。

我遇到了包含jQuery的模板的问题。它将一些jquery语句看作占位符并删除它们使javascript无效。

目前,这是我用来删除未被替换的占位符:

preg_replace("/\\$[^\"' \|\[]+?;/", "", $tmp);

它成功地将此$get.q.htmlentities();替换为空字符串(这很好),但对于如下所示的javascript,它会删除等号后的所有内容。

var val = $(this).val();
var me = $(this);

我认为最好的解决方案是忽略括号之间有值的任何内容,但我不知道如何将其添加到我当前的preg_replace语句中。我该怎么做才能添加这个,或者我能做些什么更好的事情?

占位符格式

占位符有几种格式:

  • $开头,以;
  • 结尾
  • 占位符只能包含a-zA-Z0-9._()
  • $;
  • 之间不能包含空格
  • (
  • 后可能不会$
  • 括号之间没有任何内容

有效示例(替换为空字符串):

$placeholder;
$get.q.htmlentities().json_encode();

无效的例子(不管它):

$(this).placeholder();
$()placeholder;
$10.00 per/hr;

1 个答案:

答案 0 :(得分:2)

正如评论中所述,这是一种解决方法:
(?<!=|= )\$[^\"' \|\[]+?;:我们添加了(?<!=|= )以防止=={space}后面的匹配。 的 Online demo

上面的正则表达式并不是那么好,因为如果有更多的空格会失败。所以这是一个全新的方法:
\$[^\(\);]+(?:\(\))?(?:\.[^\(\)]+(?:\(\))?)*?;

<强> Explanation

<强> Online demo