簡體   English   中英

正則表達式:選擇特定字符串前后的所有字符

[英]regex: select all characters before and after a specific string

我想選擇特定子字符串前后的所有文本,我使用以下表達式來做到這一點,但它沒有選擇所有需要的文本:

/^(?:(?!\<\?php echo[\s?](.*?)\;[\s?]\?\>).)*/

例如:

$re = '/^(?:(?!\<\?php echo[\s?](.*?)\;[\s?]\?\>).)*/';
$str = 'customFields[<?php echo $field["id"]; ?>][type]';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

它只會選擇這部分customFields[ ,而預期的結果應該是customFields[][type]

檢查此鏈接以進行調試

模式^(?:(?!\\<\\?php echo[\\s?](.*?)\\;[\\s?]\\?\\>).)*使用一個溫和的貪婪標記,它匹配除從字符串^開始的換行符,它滿足負前瞻的斷言。

那只會匹配customFields[

對於您的示例數據,您可以使用溫和的貪婪令牌regex demo ,但您也可以只使用否定字符類SKIP FAIL

^[^[]+\[|<\?php echo\s(.*?)\;\s\?\>(*SKIP)(*FAIL)|\]\[[^]]*\]

正則表達式演示| php 演示

例如

$re = '/^[^[]+\[|<\?php echo\s(.*?)\;\s\?\>(*SKIP)(*FAIL)|\]\[[^]]*\]/';
$str = 'customFields[<?php echo $field["id"]; ?>][type]';
preg_match_all($re, $str, $matches, PREG_SET_ORDER);
print_r($matches);

結果

Array
(
    [0] => Array
        (
            [0] => customFields[
        )

    [1] => Array
        (
            [0] => ][type]
        )

)

要獲得更精確的匹配,您還可以使用捕獲組:

^((?:(?!<\?php echo[\s?](?:.*?)\;\s\?>).)*)<\?php echo\s(?:.*?)\;[\s?]\?>(.*)$

正則表達式演示| php 演示

使用positive lookarounds怎么樣:

(.*)(?=\<\?php echo)|(?<=\?\>)(.*)

演示

暫無
暫無

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

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