不幸的是,我不是正则表达式专家。所以,我在这里搜索并使用了我找到的一些正则表达式。";半解";我的需求已经满足了,现在我正在寻找缺失的小部分。
一般来说,我正在使用tokenizer
中内置的PHP编写代码行。最后,我得到了一个包含Whitespace
、Tabs
和breaks
的代码字符串。我在这里发现的东西已经清理干净了;不必要的空白";。但我想更进一步:
$foo [ 'bar' ], $foo ['bar' ], $foo [ 'bar']
(包含一些空白(
应该全部转到:$foo['bar']
(不再有空格(
$foo [ "bar" ], $foo ["bar" ], $foo [ "bar"]
应转到:$foo ["bar"]
但是:$foo [ 'this is different' ]
应转到$foo['tis is different']
(保留有效空白(
目前我使用:
$_S = array( " [", " '", "' ", " ]" );
$_R = array( "[", "'", "'", "]" );
$_tx = preg_replace( '/s+/', ' ', $A_tx);
$_tx = str_replace( $_S, $_R, $_tx );
但可以肯定的是,这项工作也可以只用一个更复杂的正则表达式来完成?
如果您想使用单一模式,一个选项可以是使用两个捕获组和一个带有分支重置组的交替。
我假设$foo['tis is different']
应该是$foo['this is different']
更换时使用两组$1$2
$w+K(?|h*([)h*('[^']+')h*|(h*[)h*("[^"]+")h*)(?=])
图案与匹配
$w+
匹配$
和1+字字符K
忘记目前匹配的内容(?|
支路复位组h*([)h*('[^']+')h*
捕获组1中的[
和第2组中的打开至关闭'
,并匹配周围所有要移除的空间|
或(h*[)h*("[^"]+")h*
捕获组1中的空间和[
以及第2组中的打开至关闭"
,仅匹配"
周围的空间
)
关闭分支复位组(?=])
直接在右侧断言]
字符
Regex演示| Php演示
$re = '/$w+K(?|h*([)h*('[^']+')h*|(h*[)h*("[^"]+")h*)(?=])/m';
$str = '$foo [ "bar" ], $foo ["bar" ], $foo [ "bar"]
$foo [ 'bar' ], $foo ['bar' ], $foo [ 'bar']
$foo [ 'this is different' ]';
$result = preg_replace($re, '$1$2', $str);
echo $result;
输出
$foo ["bar"], $foo ["bar"], $foo ["bar"]
$foo['bar'], $foo['bar'], $foo['bar']
$foo['this is different']