php preg_replace 100%变为100;%

时间:2015-11-28 18:05:47

标签: php regex preg-replace

我已经做了一段时间没有成功。所以我在寻求帮助。

我有什么:

我有一系列我正在寻找的各种模式,所以我可以替换它们。阵列中的所有其他项目都没有问题。这些替换字符串中只有一个做了我以前从未见过的事情。

字符串是:

width_(\d+\w+)=width: $1;

当通过爆炸在等号上分开时:

$a = explode( '=', $replacement_string );

这变为:

$a[0] = "width(\d+\w+)";

$a[1] = "width: $1;";

然后针对传入的字符串对其进行测试。

$a = preg_replace( "/$a[0]/i", "$a[1]", $incoming_string );

现在"我不知道为什么会这样做"部分。如果传入的字符串是

"width_100px"

我回来了

"width: 100px;"

但是如果传入的字符串是

"width_100%"

我回来了

"width: 100;%"

奇怪的是 - 如果我刚刚回来

"width: 100;"

我能理解。 "%"与分号(;)匹配。但这会将分号置于和百分号。只是他们被逆转了。我甚至试图查看是否有百分号并将其更改为

"width_100\%"

但这并没有改变它的结果。

我也尝试过" %%"而不只是一个"%"。

仍然出现
width: 100;%

任何帮助表示感谢。

ANSWERED:

这个难题的答案是" \ w"正则表达式的一部分 NOT 匹配百分号(%),因为\ w只是[a-zA-Z0-9_](如下面的Uby所示。因为所有这些字符串都被分解了为了分离请求,width_100%本身就是通过改变它所寻找的东西(\ d +(。*))(根据Chris85的建议) - 这就抓住了数字(在这种情况下为100) )以及百分号因此允许我将其转换为"宽度:100%;"。

感谢Chris和Uby的帮助。

2 个答案:

答案 0 :(得分:1)

您的正则表达式为\d+\w+,其中不包含char %百分比。因此,替换只会忽略它,只用width_100替换width: 100;

尝试将(\d+\w+)替换为(\d+[a-zA-Z0-9_%]+)

答案 1 :(得分:1)

您可以在此处查看当前的问题:https://regex101.com/r/xD9rG3/1

%未匹配,因此保留。您可以告诉正则表达式使用此表达式查找%px

width_(\d+(?:px|%))

功能演示:

$replacement_string = 'width_(\d+(?:px|%|em))=width: $1;';
$a = explode( '=', $replacement_string );
//$a[0] = "width(\d+\w+)";
//$a[1] = "width: $1;";
$incoming_string = 'width_100%';
$a = preg_replace( "/$a[0]/", "$a[1]", $incoming_string);
echo $a;

正则表达式101演示:https://regex101.com/r/xD9rG3/2

另外,您应该注意\w包含下划线,因此您的其他正则表达式可能会失败。如果您只想查找字母字符,请使用[a-zA-Z]+或添加\d,如果您想要包含数字。

您可以使用的另一个正则表达式,我不建议使用:

width_(\d+.*)

这表示找width_任意数量的数字,然后是其他每个字符。这可能会为您生成无效的CSS。这会匹配您的whatever the part is after the number请求但是