如何在不担心它们之间的空格的情况下找到两个连续的字符

时间:2016-08-18 14:41:39

标签: php arrays string str-replace

我想在字符串中找到字符1和#然后爆炸。我可以使用爆炸。我的问题是我不知道这两个字符之间可以出现多少空间。

// This is what is how my string looks / may look like
1                #first                  (dog)
1 #second                                (cat)
1           #third                       (dog)

// this is what i want to do 
$return = str_ireplace('1 #', ',1 #', $string); // this line is the problem because it only searches for 1 # and not 1    #
$return = explode(","$return);

// this is how i want my output
Array
(
  [0] => 1                #first                  (dog)
  [1] => 1 #second                                (cat)
  [2] => 1           #third                       (dog)
)

5 个答案:

答案 0 :(得分:1)

正则表达式几乎可以满足您的需求。您只需更换

即可
$return = str_ireplace('1 #', '1 #', $string);

$return = preg_replace('/1 +#/', '1 #', $string);

并且那样做你想要的。

关于正则表达式的简短说明:

开头和结尾的/分隔正则表达式的开头和结尾。实际的正则表达式可以是这些斜杠之间的任何东西。事实上,它们不必是斜杠 - 任何非空白字符都可以是分隔符,但请记住,必须使用反斜杠转义正则表达式中此字符的任何出现。这些分隔符的原因是正则表达式后面可以跟各种修饰符来更改正则表达式的行为方式,例如i用于不区分大小写的搜索。

1与锡上所说的匹配 - 单个数字。它匹配您正在搜索的字符串中的任何位置。该空格还匹配文字空格字符,#匹配字面符号。

+表示前面的字符可能不会只出现一次,而是一次或多次次。因此/a+/将匹配aaaaaaaaaa等。

所以基本上这个正则表达式匹配任何包含一个后跟一个或多个空格的字符串,然后是一个井号,并用字符串'1 #'替换整个事物。

正则表达式是一个比我在这里解释的更复杂的野兽,但基本上任何时候你都不想匹配一个完全字符串但是一个字符串的部分可能在不同的匹配项之间变化,正则表达式可能就是你所需要的。

你可以查看http://regexone.com/关于正则表达式的正确入门,它们非常有用。想知道某些东西是否是有效的邮政编码?正则表达式。想看看有什么东西看起来像电话号码吗?正则表达式。想知道密码是否包含足够的字符,包含至少一个字符,至少一个数字,并且不包含用户名?正则表达式。可能性是无穷无尽的。

答案 1 :(得分:0)

您可以更改此行以删除所有空格:

$return = str_ireplace('1#', ',1 #', str_ireplace(' ','',$string));

答案 2 :(得分:0)

您可以在字符串上使用preg_split(..)功能,如下所示:

ProductId

修改
要捕获分隔符本身(不确定原因)请使用以下内容:

ProductPicture

代码的作用:

  • 第1行定义了一个正则表达式来搜索匹配的字符串 $str = "1 #first (dog) 1 #second (cat) 1 #third (dog)"; $regex = "/1\s*#/"; $keywords = preg_split($regex, $str, 0, PREG_SPLIT_NO_EMPTY); print_r($keywords);
  • 第2行插入$regex = "/1\s*#/"; $strFixed = preg_replace($regex, "|\\0", $str); $tokens = array_filter(explode('|', $strFixed)); print_r($tokens); 作为分隔
  • 的字符
  • 第3行在1space(s)#分隔符上展开并过滤空元素
  • 第4行打印数组

输出

|

答案 3 :(得分:0)

<强>更新

你可以通过array_filter()preg_split()array_map()的组合来做到这一点...加上你也可以 quick-test it here...

    <?php
        $str        = "1                #first                  (dog)";
        $str       .= "1 #second                                (cat)";
        $str       .= "1           #third                       (dog)";

        $return     = array_filter(preg_split("#\)#", $str));
        $return     = array_map(function($string){
            return $string .= ")";
        }, $return);

        var_dump($return);
        // PRODUCES::
        array (size=3)
          0 => string '1                #first                  (dog)' (length=46)
          1 => string '1 #second                                (cat)' (length=46)
          2 => string '1           #third                       (dog)' (length=46)

答案 4 :(得分:0)

那个怎么样:

$str = '1                #first                  (dog)
1 #second                                (cat)
1           #third                       (dog)';

preg_match_all('/(1[^1]+)/', $yourStr, $matches);
$matches = array_map('trim', $matches[0]);

print_r($matches);

此正则表达式匹配以数字1开头的部分,然后继续匹配所有内容,直到找到数字1