簡體   English   中英

使用正則表達式來匹配? 但不是\\?

[英]Use regular expressions to match an ? but not a \?

我有一個PHP正則表達式,它可以很好地解析一些奇怪的遺留客戶端模板,直到最近我們發現模板表達式中包含一個轉義的問號(\\?)。 我的常規表達能力不足以將我的軟弱的面條包裹在一個負向的前方或者一些技術 - 巨型 - 巨型表面上,所以,正確方向的提示或點將非常感激。

我的PHP:

preg_match_all("/\{\{IF (.*)\?(.*):(.*)\}\}/U", $template, $m, PREG_SET_ORDER);

好吧,當我發布這個問題時,我有點不知所措。 請允許我將其置於適當的背景下。

模板代碼如下所示:

{{IF VAR?"SHOW: THIS?":"SHOW {{ELSE}}"}}

哪個應解析為:

if ($template[$var]) {
 echo "SHOW: THIS?";
} else {
 echo "SHOW ".$template['ELSE'];
}

我目前幾乎用我的功能實現了這一點,但並非完全如此。 這是功能:

preg_match_all("/\{\{IF ((?:[^\\?]|\\.)*)\?((?:[^\\:]|\\.)*):(.*)\}\}[^<\/]/", $template, $m, PREG_SET_ORDER);
if (count($m)) {
 foreach ($m as $o) {
  if (preg_match("/(.*)\s+(==|!=)\s+(.*)/", $o[1], $x)) {
   if (preg_match("/^\"(.*)\"/", $x[1], $cx)) $e1 = $cx[1];
   else $e1 = is_numeric($x[1])?$x[1]:$data[$x[1]];
   if (preg_match("/^\"(.*)\"/", $x[3], $cx)) $e2 = $cx[1];
   else $e2 = is_numeric($x[3])?$x[3]:$data[$x[3]];
   if (preg_match("/^\"(.*)\"/", $o[2], $ox)) $er[0] = $ox[1];
   else $er[0] =  addslashes(htmlspecialchars($data[$o[2]]));
   if (preg_match("/^\"(.*)\"/", $o[3], $ox)) $er[1] = $ox[1];
   else $er[1] = addslashes(htmlspecialchars($data[$o[3]]));
   $eval = "\$od = (\"$e1\" $x[2] \"$e2\")?\"$er[0]\":\"$er[1]\";";
   eval($eval);
  } else {
   $od = $data[$o[1]]?$o[2]:$o[3];
   if (preg_match("/^\"(.*)\"/", $od, $x)) $od = $x[1];
   else $od = $data[$od];
  }
  $template = str_replace($o[0], $od, $template);
 }
}

if (is_array($data))
 foreach ($data as $k => $v) $template = str_replace('{{'.$k.'}}', $v, $template);
return $template;

你需要改變你的(.*)區域 - 你想要匹配一系列任何東西都不再是真的。 相反,您希望匹配一系列非轉義字符或轉義序列: ((?:[^\\\\]|\\\\.)*)這將匹配包含反斜杠轉義的任何字符串。 我認為你可以通過指定你不想匹配你不能匹配的問號或冒號來提高性能; 如果你這樣做,你最終會得到正則表達式/\\{\\{IF ((?:[^\\\\?]|\\\\.)*)\\?((?:[^\\\\:]|\\\\.)*):(.*)\\}\\}/ 雖然這看起來很討厭,但我只是用你上面的結構代替你的(.*) s; 這很簡單。

為什么不

(.*)[^\\]\?(.*)

這是有效的。 感謝@absz指出正確的方向。

preg_match_all("/\{\{IF ([^\"\\]]*(\\.[^\"\\]]*)*)\?((?:[^\\:]|\\.)*):(.*)}\}/", $template, $m, PREG_SET_ORDER);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM