php preg_replace 100% 变成 100;%

php preg_replace 100% becomes 100;%

我已经为此工作了一段时间但没有成功。所以我寻求帮助。

我有:

我有一系列正在寻找的各种图案,因此我可以替换它们。阵列中的所有其他项目都可以正常工作。这些替换字符串中只有一个执行了我以前从未见过的操作。

字符串是:

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

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

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

这变成:

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

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

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

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

现在是 "I have no idea why it is doing this" 部分。如果传入的字符串是

"width_100px"

我回来了

"width: 100px;"

但是如果传入的字符串是

"width_100%"

我回来了

"width: 100;%"

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

"width: 100;"

我能看懂。 “%”匹配分号 (;)。但这会将分号放在 AND 百分号中。只是它们是相反的。我什至尝试查看是否有百分号并将其更改为

"width_100\%"

但这并没有改变结果。

我也只是尝试了“%%”而不是一个“%”。仍然是

width: 100;%

感谢任何帮助。

已回答:

这个难题的答案是正则表达式的“\w”部分 匹配百分号 (%) 因为 \w 只是 [a-zA -Z0-9_](如下面的 Uby 所示。由于所有这些字符串都分解为单独的请求,因此 width_100% 完全独立,因此通过将其查找的内容更改为 (\d+(. *))(根据下面 Chris85 的建议)- 这捕获了数字(在本例中为 100)以及百分号,因此允许我将其转换为 "width: 100%;".

感谢 Chris 和 Uby 的帮助。

您的正则表达式 \d+\w+ 不包括百分比字符 %。因此替换将简单地忽略它并仅将 width_100 替换为 width: 100;.

尝试用 (\d+[a-zA-Z0-9_%]+)

替换 (\d+\w+)

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

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

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

功能演示:

$replacement_string = 'width_(\d+(?:px|%|em))=width: ;';
$a = explode( '=', $replacement_string );
//$a[0] = "width(\d+\w+)";
//$a[1] = "width: ;";
$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 请求。