簡體   English   中英

使用PHP preg_match的多行字符串的正則表達式

[英]Regex for a multiline string with PHP preg_match

我想建立一個多行字符串的模式,即必須以<?phpwhitespace + <?php ,並沒有結束?>?> + whitespace

我的嘗試是/^\\s?<\\?php.*[^>]\\s?$/s但是沒有用。 還嘗試了負面的前瞻性-沒有用。

任何想法? 提前致謝。

您可以使用

(?s)^\s*<\?php(?!.*\?>\s*$).*+$

觀看演示

正則表達式說明:

  • (?s) -為的整個模式啟用單行模式. 匹配換行符
  • ^ -字符串開頭
  • \\s* -可選的空格,0個或多個重復
  • <\\?php文字<?php
  • (?!.*\\?>\\s*$) -先行檢查字符串是否不以?>whitespace結尾
  • .*+$ -匹配時不回溯到字符串末尾的任何字符。

所有格量詞 (如.*+ )使我們能夠一次性使用一次字符,而永遠不會回來尋找可能的排列。

擁有量詞是防止正則表達式引擎嘗試所有排列的一種方法。 這主要是出於性能方面的考慮。

而且我們不使用顯式的SKIP-FAIL動詞。

在PHP中,您可以使用以下正則表達式:

'/^\s*<\?php(?:.(?!\?>\s*$))*$/s'

正則演示

  • ^\\s*<\\?php在行首匹配可選的空格和文字<?php
  • (?:.(?!\\?>\\s*$))*將使用負前瞻匹配任何0個或多個不以?>whitespace*結尾的?>whitespace*

更新:為了提高效率,此PCRE regex的執行速度將比上一個快:

'/^\s*<\?php(?>.*\?>\s*$(*SKIP)(*F)|.*+$)/s'

RegEx演示2

  • (*FAIL)表現為失敗的否定斷言,並且是(?!)的同義詞
  • (*SKIP)定義了一個點,當子模式稍后發生故障時,正則表達式引擎不允許回溯
  • (*SKIP)(*FAIL)一起提供了一個很好的限制選擇,即您不能在上面的正則表達式中留有可變長度。

暫無
暫無

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

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