preg_replace的正则表达式

时间:2012-12-02 09:03:52

标签: php regex preg-replace

我想构建一个模式来交换整数,这是行中唯一的东西

如果与整数在同一行上有一个单词,我不想改变任何内容。

我试过$pattern = '/(.)[0-9][0-9](.)/'; 但这对我来说效果不好

当我尝试例如$pattern = '/1(.)2(.)3(.)/';时,它将替换我将放入模式的唯一单个数字

我想替换此

的示例主题
subject = "
1
2
3
4
5
6
7
8
9
10
"

数字必须是整数而不是小数,而且它们的长度是随机的,但是在数字的同一行上没有任何文字?

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

正则表达不是一个魔术棒,它是每个编程问题的答案。

在这种情况下,您希望实际使用explode()\n上拆分主题,然后将这些行操作为数组,然后使用implode()重新创建主题。当它们是$lines[$x]$lines[$y]时,处理两条线要容易得多。

此外,如果这些行来自HTML,那么您不希望使用正则表达式来解析HTML。相反,您想要使用PHP DOM模块。 http://php.net/manual/en/book.dom.php

答案 1 :(得分:1)

您需要的是多行模式m。如果您在开头使用^匹配,并在每行末尾使用$匹配。然后使用\d+获得任意长整数:

/^[ \t]*\d+[ \t]*$/m

[ \t]*除了数字之外还允许任意数量的空格和制表符。请注意,这将删除空格以及数字。如果要保留空白,请使用

/^([ \t]*)\d+([ \t]*)$/m

将替换字符串更改为

$1yourReplacementString$2

修改

我现在意识到您没有换行符,例如\r\n\r\n<br>标签。这使得它更难一点。这样的事情应该涵盖大多数情况:

~((?:^|<br[ ]*/?>)[ \t]*)\d+([ \t]*(?:$|<br\b))~

同样,您需要在替换字符串周围添加$1$2,以便不删除<br>代码。

但正如Andy所说,HTML不应该使用正则表达式来处理。要么使用PHP提供的内置DOM模块,要么使用像this one这样的第三方库。