2011-04-14 71 views
1

我正在使用下面的正则表达式字符串来查找在这种情况下紧接着一个空格的单词。我在这里错过了什么?这将删除任何和所有的空间,但我需要一些左。我只是试图删除紧接着一个空格的单词,我将如何做到这一点。一个例子就是输入。 (一二三)第一次更换应删除“三”,第二次更换应删除“一”只留下两个。如果我只想要剩下三个,我只会使用第二行代码。我的主要问题是在这里得到正确的正则表达式模式。正确的正则表达式在一个单词之前或之后删除空格

preg_replace('/\s[A-z]/', '', $data); 
preg_replace('/[A-z]\s/', '', $data); 
+0

感谢大家清理A-Z错误,我认为A-Z将是整个范围,我现在看到A-Z是大写字母,而a-z是小写字母,或不区分大小写? – 2011-04-14 17:26:59

回答

1

最大的问题是,在你的榜样, “二”在它前面也有一个空间。因此,第一次替换将删除“两个”和“三个”(一旦您将[A-z]更改为[A-Za-z]+,那就是)。

我想你想是这样的:

/\s[a-z]+(?!\s)/i 
/(?<!\s)[a-z]+\s/i 

注意添加+量词。没有这个,[a-z]只会匹配一个字符,所以你的“一个两个三”的例子可能会导致“On w hree”。

另外,[A-z]技术上会导致未定义的行为(并可能抛出异常),因为大写字母A到小写字母z不是有效范围。正如我上面所做的那样,您需要[A-Za-z]或使用[a-z]进行不区分大小写的匹配。

+0

感谢您解决这个问题。现在,即使能够运行代码即时看到它可能不可行,就像每个人都说要么取代中间词。所以我可以将(One Two Three)的前导空格去掉(One),或者将空格作为(One Two Three)加到(Three)之后,是否没有任何解决方法可以让这个词在中间留下来?这是最好的想法,但它显然不适用于中间的单词......任何想法? – 2011-04-14 17:25:17

+0

@Ryan - 上面的代码应该仅仅因为负面变化而留下“两个”。你也可以使用'/^[a-z] + \ s | \ s [a-z] + $/i'这类的东西,只应该为字符串中的第一个和最后一个单词。 – 2011-04-14 17:50:18

+0

上面的更新代码似乎不适用于我的情况,无论您在评论中引用的代码是否完美无缺。再次感谢! :) – 2011-04-14 18:18:35

0

添加+以获得A和z之间的一个或多个字符。

preg_replace('/[A-Za-z]+\s/', '', $data); 
preg_replace('/\s[A-Za-z]+/', '', $data); 
+0

无效的正则表达式:不允许使用[A-z]。 – hsz 2011-04-14 17:02:57

2

[A-z]比赛只有一个字母 - 它它太不正确,因为你应该声明[a-zA-Z]匹配所有大写和小写字母。

与尝试:

/\s[a-zA-Z]+/ 

/[a-zA-Z]+\s/ 

之后,你的代码应该是这样的:

preg_replace('/\s[a-zA-Z]+/', '', $data); 
preg_replace('/[a-zA-Z]+\s/', '', $data); 
相关问题