ChatGPT解决这个技术问题 Extra ChatGPT

匹配正则表达式中的空格

如何匹配 PHP 正则表达式中的空格字符?

我的意思是像“gavin schulz”,两个词之间的空格。我使用正则表达式来确保我只允许字母、数字和空格。但我不知道如何找到空间。这就是我现在所拥有的:

$newtag = preg_replace("/[^a-zA-Z0-9s|]/", "", $tag);
嗯......也没有关于匹配“a”或“b”的问题......;)
您应该会看到 regex examples

p
paxdiablo

如果您正在寻找一个空格,那就是 " "(一个空格)。

如果您要查找一个或多个,则为 " *"(即 两个 个空格和一个星号)或 " +"(一个空格和一个加号)。

如果您正在寻找公共间距,请使用 "[ X]""[ X][ X]*""[ X]+",其中 X 是物理制表符(在所有这些示例中,每个前面都有一个空格)。

这些将在我见过的每一个* 正则表达式引擎中工作(其中一些甚至没有一个或多个 "+" 字符,呃)。

如果您知道您将使用更现代的正则表达式引擎之一,那么 "\s" 及其变体就是您的最佳选择。此外,我相信单词边界也匹配行的开头和结尾,这在您查找可能出现的单词之前或之后没有空格时很重要。

特别是对于 PHP,this page 可能会有所帮助。

从您的编辑中,您似乎想要删除所有无效字符这开始是(注意正则表达式内的空格):

$newtag = preg_replace ("/[^a-zA-Z0-9 ]/", "", $tag);
#                                    ^ space here

如果您还想要欺骗以确保每个单词之间只有一个空格,并且在开头或结尾处没有空格,那会稍微复杂一些(可能是另一个问题),但基本思想是:

$newtag = preg_replace ("/ +/", " ", $tag); # convert all multispaces to space
$newtag = preg_replace ("/^ /", "", $tag);  # remove space from start
$newtag = preg_replace ("/ $/", "", $tag);  # and end

他原来的正则表达式似乎想替换 " " 字符。您正在否定该空间,因此他的空间不会按预期“删除”。
引用:“只允许字母、数字和空格”,Gavin 的原始 RE 是错误的(这就是他问这个问题的原因)。我的 RE 会删除不属于其中的所有内容。
为什么空格必须在匹配模式的末尾而不是在中间?
@warren,它没有。 “这里的空间”评论并没有说明空间的去向,而是说明那里有一个空间(以防读者没有意识到)。
@Mike,不,事实并非如此。此处的目的是替换集合 A-Za-z... 中所有 not 的字符。方括号内的插入符号说明了这一点。将插入符号移出方括号会将其含义更改为匹配字符串开头的集合 in 中的字符。
F
Fletcher Rippon

备忘单

这是您需要了解的有关正则表达式中空格的所有内容的小备忘单:

[[:空白的:]]

仅限空格或制表符,而不是换行符。与写 [ \t] 相同。

[[:space:]] & \s

[[:space:]]\s 相同。它们都将匹配任何空白字符空间、换行符、制表符等......

\v

匹配垂直 Unicode 空白。

\H

匹配水平空白,包括 Unicode 字符。它还将匹配空格、制表符、不间断/数学/表意空格。

x(扩展标志)

忽略所有空格。请记住,这是一个标志,因此您将其添加到正则表达式的末尾,如 /hello/gmx。此标志将忽略正则表达式中的空格。

例如,如果您编写像 /hello world/x 这样的表达式,它将匹配 helloworld,但不匹配 hello world。扩展标志还允许在您的正则表达式中添加注释。

例子

/helloworld #hello this is a comment/

如果需要使用空格,可以使用 \ 来匹配空格。


不完全是“一切”:您还需要知道 \s 是一个字符类,因此可能需要也可能不需要包装在 []() 中,具体取决于语言/方言。
\s 和 [ ] 之间有什么区别(即方括号中的空格或字符集中的空格)。它们都可以互换吗?我可以使用两者中的任何一个来检测两个单词之间的空格吗?
I
Iulian Onofrei

要精确匹配空格字符,您可以使用八进制值 \040 (Unicode characters displayed as octal) 或十六进制值 \x20 (Unicode characters displayed as hex)。

这是正则表达式语法参考:https://www.regular-expressions.info/nonprint.html


H
HamZa

在 Perl 中,开关是 \s(空格)。


这是不正确的 - 它收集所有空格,而不仅仅是空格字符。
但是这个问题是用 PHP 标记的,而不是 Perl。
@PeterMortensen Perl 和 PHP 使用相同的正则表达式引擎 PCRE,因此这将在 PHP 中工作。
P
Peter Boughton

我正在使用正则表达式来确保我只允许字母、数字和空格

然后它就像在你已经拥有的东西上添加一个空间一样简单:

$newtag = preg_replace("/[^a-zA-Z0-9 ]/", "", $tag);

(注意,我删除了看似无意的 s|?当然 s 是多余的;如果需要,您可以恢复 |

如果您特别想要 *a* 空间,例如只有一个空间,您将需要比这更复杂的表达式,并且可能需要考虑单独的非正则表达式逻辑。


K
Kibbee

在我看来,在这种情况下使用 REGEX 会有点矫枉过正。为什么不只是 strpos 来查找空格字符。此外,正则表达式中的空格字符并没有什么特别之处,您应该能够像搜索任何其他字符一样搜索它。也就是说,除非您禁用了模式空白,在这种情况下几乎没有必要这样做。


S
Suroot

您也可以使用 \b 作为单词边界。对于名称,我会使用这样的名称:

[^\b]+\b[^\b]+(\b|$)

编辑将其修改为 Perl 示例中的正则表达式

if( $fullname =~ /([^\b]+)\b[^\b]+([^\b]+)(\b|$)/ ) {
 $first_name = $1;
 $last_name = $2;
}

再次编辑根据你想要的:

$new_tag = preg_replace("/[\s\t]/","",$tag);

单词边界匹配器 \b 也匹配连字符
P
Peter Mortensen

像这样使用它以允许一个空间。

$newtag = preg_replace("/[^a-zA-Z0-9\s]/", "", $tag)

J
Jeremy Schultz

我正在尝试 [[:space:]] 在一个实例中,看起来 WordPress 中的博主正在使用非标准空格字符。看起来它会起作用。


“WordPress 中的博主”是什么意思?你能详细说明吗?
@PeterMortensen 当我为一家主要出版商开发和支持一堆 WordPress 博客时,这又回来了。作家们正在写带有一些意想不到的空格字符的帖子。