用于提取没有空格的哈希标记的正则表达式

cod*_*101 3 php regex preg-match-all preg-match

我正在使用这个:

$t = "#hashtag #goodhash_tag united states #l33t this";
$queryVariable = "";
if(preg_match_all('/(^|\s)(#\w+)/', $t, $arrHashTags) > 0){
    array_filter($arrHashTags);
    array_unique($arrHashTags);
    $count = count($arrHashTags[2]);
    if($count > 1){
        $counter = 1;
        foreach ($arrHashTags[2] as $strHashTag) {
            if (preg_match('/#\d*[a-z_]+/i', $strHashTag)) {
                if($counter == $count){
                    $queryVariable .= $strHashTag;              
                } else{
                    $queryVariable .= $strHashTag." and ";
                }
                $newTest = str_replace($arrHashTags[2],"", $t);                 
            }
            $counter = $counter + 1;
        }
    }
}
echo $queryVariable."<br>"; // this is list of tags
echo $newTest;   // this is the remaining text
Run Code Online (Sandbox Code Playgroud)

基于$t以上的输出是:

#hashtag and #goodhash_tag and #l33t
united states this
Run Code Online (Sandbox Code Playgroud)

第一个问题:

如果$t = '#hashtag#goodhash_tag united states #l33t this';两个标签之间没有空格,则输出变为:

#hashtag and #l33t
#goodhash_tag united states this
Run Code Online (Sandbox Code Playgroud)

第二个问题:

如果$t = '#hashtag #goodhash_tag united states #l33t this #123';ie带有无效标签,#123它会以某种方式扰乱我$queryVariable输出的标签列表,就像输出一样

#hashtag and #goodhash_tag and #l33t and // note the extra 'and'
united states this
Run Code Online (Sandbox Code Playgroud)

如果有人请帮忙解决这两个问题?

hjp*_*r92 5

而不是为你的正则表达式使用这么多的比较等.您可以简单地拥有以下内容:

$t = "#hashtag #goodhash_tag united states #l33t this #123#tte#anothertag sth";
$queryVariable = "";
preg_match_all('/(#[A-z_]\w+)/', $t, $arrHashTags);
print_r( $arrHashTags[1] );
Run Code Online (Sandbox Code Playgroud)

要将它们作为字符串and加入它们,您可以使用implode.

$queryVariable = implode( $arrHashTags[1], " and " );
Run Code Online (Sandbox Code Playgroud)

对于剩余的文本,您可以拥有preg_replacestr_replace(根据您的要求).


这是键盘链接.