PHP检查字符串是否包含单词之间的空格(不在开头或结尾)

13

我需要检查一个字符串是否在单词之间包含空格,但不包括在开头或结尾。假设有以下这些字符串:

1: "how r u ";
2: "how r u";
3: " howru";

那么只有2应该为真。我该怎么做?


将原始字符串与修剪后的字符串进行比较,如果它们长度相同,则返回 true。 - Mark Baker
好的,好主意 ^^ 谢谢 - Eddy Unruh
1
@MarkBaker 对不起,你误解了问题。 - heximal
@heximal 不是很准确,你可以检查字符串的第一个和最后一个字符是否为空格,如果不是,则在整个字符串中查找空格。 - Eddy Unruh
@chris85 是的,它会。好的,也许我应该说“在字符串的任何地方,但不在开头或结尾”。 - Eddy Unruh
3个回答

39

你可以验证截取后的字符串是否与原始字符串相等,然后使用strposstr_contains查找空格。

// PHP < 8
if ($str == trim($str) && strpos($str, ' ') !== false) {
    echo 'has spaces, but not at beginning or end';
}

// PHP 8+
if ($str == trim($str) && str_contains($str, ' ')) {
    echo 'has spaces, but not at beginning or end';
}

如果您感兴趣,以下是更多信息

在这种情况下,如果您使用strpos(),您不必像通常检查子字符串时一样使用严格比较到false。通常需要该比较,因为如果字符串以子字符串开头,strpos()将返回0,其被视为false

这里不可能出现strpos()返回0的情况,因为初始比较 $str == trim($str) 排除了字符串以空格开头的可能性,所以您也可以这样使用:

if ($str == trim($str) && strpos($str, ' ')) { ...
如果您想使用正则表达式,可以使用以下内容来检查空格字符:
if (preg_match('/^[^ ].* .*[^ ]$/', $str) { ...

或者使用这个来检查是否有任何空格字符:

if (preg_match('/^\S.*\s.*\S$/', $str) { ...

我进行了一些简单的测试(只是定时执行此代码片段的重复操作),trim/strpos解决方案比preg_match解决方案快大约两倍,但我不是正则表达式专家,因此可能有优化表达式以提高性能的可能性。


2
strpos(trim($str), ' ') !== false 必须。 - heximal
1
@heximal 这将导致上面的示例中的1为真(以及我对标题的答案),但如果只有2个应该为真,则答案是正确的。 - clemens321
是的,你说得对)默认情况下,如果前面的表达式失败了,剩余的表达式都不会被计算。 - heximal

4
如果您的字符串至少有两个字符长,您可以使用以下方法:
if (preg_match('/^\S.*\S$/', $str)) {
    echo "begins and ends with character other than space";
} else {
    echo "begins or ends with space";
}

\S代表任何非空格字符。


0

你可以在数组中访问字母

for($i = 1 ; i < strlen($word)-1 ; $i++ )
{
 if($word[$i] = " " ;
 {
  echo "space" ;
 }
}

1
如果循环不给出性能,那么如果$word太长会发生什么? - jjoselon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接