【问题标题】:preg_match_all after hash tag before next hash tag in a stringpreg_match_all 在哈希标记之后 在字符串中的下一个哈希标记之前
【发布时间】:2012-06-21 12:30:02
【问题描述】:

我想找到(如果它们存在)任何哈希标签,并获取每个标签的第一个共现加上它之后但在下一个标签之前的文本(如果存在另一个标签)。

*并非所有消息字符串都带有哈希标签!

这是我想要做的:

发送到脚本的可能字符串示例列表:

1) $message = '添加了一些新内容';

2) $message = '#BALANCE X的平衡运动';

3) $message = '#CHANGE 一些日志文本 #FIX 一些其他日志文本';

$num = prereg_match_all('@?????@', $message, $matches);

这是我从比赛中瞄准的数组结构结果:

示例 1) 的结果

(
[0] => Array
    (
        [0] => Added some new stuff
    )
)

示例 2) 的结果

(
[0] => Array
    (
        [0] => balanced movement of X
        [1] => #BALANCE
    )
)

示例 3) 的结果

(
[0] => Array
    (
        [0] => some log text
        [1] => #CHANGE
    )
[1] => Array
    (
        [0] => some other log text
        [1] => #FIX
    )
)

试图在 REGEX 上找到像样的文档让我发疯的事情

【问题讨论】:

标签: php regex preg-match-all hashtag


【解决方案1】:

试试这个代码:

$msg = '#CHANGE some log text #FIX some other log text';
$msg = preg_replace('/(#[\w]+)(\s+)/', "\n\n$1\n", $msg);

foreach (explode("\n\n", trim($msg)) as $k => $v) {
    $res[$k] = array_reverse(explode("\n", $v));
}

print_r($res);
/*
Array
(
    [0] => Array
        (
            [0] => some log text 
            [1] => #CHANGE
        )

    [1] => Array
        (
            [0] => some other log text
            [1] => #FIX
        )

)
*/

【讨论】:

  • 对于不包含主题标签的测试用例,这将失败。
  • 不。使用所有 OP 的输入字符串进行测试,并按预期返回。
  • 我的错 - 我注意到您的正则表达式专门寻找主题标签,没有它就无法匹配。另外,我没有通过您在preg_replace 之后执行的额外处理来查看发生了什么。
  • 我解决了,bsdnoobz 是最接近的,但这个愚蠢的网站不允许我再发布 6 个小时对我自己的问题的答案!!!! ......
【解决方案2】:

为所有测试用例尝试这样的方法:

$messages[] = 'Added some new stuff';
$messages[] = '#BALANCE balanced movement of X';
$messages[] = '#CHANGE some log text #FIX some other log text';

foreach( $messages as $message) {
    preg_match_all( '~(#\w+)?\s*([\w\s]+)~i', $message, $matches);
    // var_dump( $matches);
    echo "Message: " . $message . "\n";
    $count = strlen( $matches[1][0]);
    if( $count == 0) {
        // No hash tags
        echo "No hash tags, so the match string text is: " . $matches[2][0] . "\n";
    } else {
        for( $i = 0; $i < count( $matches[1]); $i++) {
            echo "\t Hash tag $i\n";
            echo "\t\t - Tag: ".$matches[1][$i]." Value: ".$matches[2][$i]."\n";
        }
    }
}

这个输出:

Message: Added some new stuff
No hash tags, so the match string text is: Added some new stuff

Message: #BALANCE balanced movement of X
     Hash tag 0
         - Tag: #BALANCE Value: balanced movement of X

Message: #CHANGE some log text #FIX some other log text
     Hash tag 0
         - Tag: #CHANGE Value: some log text 
     Hash tag 1
         - Tag: #FIX Value: some other log text

See it work

【讨论】:

    【解决方案3】:

    我刚收到!经过 3 小时的战斗,BSDNOOBZ 给出了最接近的答案……

    给它以下几种情况:

    $messages[] = 'Blla vajfkj asfhkha asfha lskahfa';
    $messages[] = '#CHANGE reduced sentry health/armor to 325/100 and made them easier to repair with welders #FIX reduced sentry build time to 6 seconds (down from 10)';
    foreach($messages AS $message)
    {
        $num = preg_match_all('@(\#\w+)([^#]+)@', $message, $matches, PREG_SET_ORDER);
        if($num > 0)
        {
            print_r($matches);
        } else {
            echo $message;
        }
    }
    

    结果:

    string Blla vajfkj asfhkha asfha lskahfa
    
    Array ( 
        [0] => Array 
        ( 
            [0] => #CHANGE reduced sentry health/armor to 325/100 and made them easier to repair with welders 
            [1] => #CHANGE 
            [2] => reduced sentry health/armor to 325/100 and made them easier to repair with welders 
        ) 
        [1] => Array 
        ( 
            [0] => #FIX reduced sentry build time to 6 seconds (down from 10) 
            [1] => #FIX 
            [2] => reduced sentry build time to 6 seconds (down from 10) 
        )
    )
    

    【讨论】:

      猜你喜欢
      • 2014-08-26
      • 2013-02-22
      • 1970-01-01
      • 1970-01-01
      • 2017-05-07
      • 1970-01-01
      • 2017-01-16
      • 2011-09-30
      • 1970-01-01
      相关资源
      最近更新 更多