使用正则表达式匹配多个模式并在条件上执行失败

时间:2017-05-05 09:59:33

标签: php regex preg-match

我有一个字符串,其中包含匹配的分组模式和Tilde,其中包含列表项。但是当我对某些群体没有模式时,就会离开那个群体。

请参阅我的代码

$steps = '
--First Step ~30 mins~
First step method content goes here.
--Second Step ~10 mins~
Second step method content goes here.
--Third Step
Third step method content goes here.
';

$steps_list = explode( PHP_EOL, trim( $steps ) );

echo '<ol class="steps">';
foreach( $steps_list as $key => $data ) {
    if ( preg_match('/^\s*\-{2}(.*)([^~]+)(~([^~]+)~)/', $data, $matches )  && ( strpos( $data, '~' ) !== false ) ) {
    echo '<li>';
    echo '<h4 class="step_title">' . $matches[1] . '</h4>';
    echo '<span class="duration">' . $matches[3] . '</span>';
    } 
    else{
    //replacing data with span tags around it
    echo $data = str_replace( $data, '<p class="decription">' . $data . '</p>', $data );
    echo '</li>';
    }
}
echo '</ol>';

结果:

<ol class="steps">
    <li>
        <h4 class="step_title">First Step</h4><span class="duration">~30 mins~</span>
        <p class="decription">First step method content goes here.</p>
    </li>
    <li>
        <h4 class="step_title">Second Step</h4><span class="duration">~10 mins~</span>
        <p class="decription">Second step method content goes here.</p>
    </li>
    <p class="decription">--Third Step</p>
    </li>
    <p class="decription">Third step method content goes here.</p>
    </li>
</ol>

1)在上面的结果中,如果您注意到第三个步骤会抛出错误的列表而不启动li的标记,因为它不会将第三步作为标题。

2)在第1和第2个标题持续时间部分,代码执行中tilde符号未被修剪/删除。

我想要的结果是什么。

<ol class="steps">
    <li>
        <h4 class="step_title">First Step</h4><span class="duration">30 mins</span>
        <p class="decription">First step method content goes here.</p>
    </li>
    <li>
        <h4 class="step_title">Second Step</h4><span class="duration">10 mins</span>
        <p class="decription">Second step method content goes here.</p>
    </li>
    <li>
        <h4 class="step_title">Third Step</h4>
        <p class="decription">Third step method content goes here.</p>
    </li>
</ol>

我做错了什么?

1 个答案:

答案 0 :(得分:1)

你去。

由于您的时间部分在第三步中是可选的,因此我检查了匹配是否超过2.

由于第三部分~中没有strpos()将返回false。将其更改为OR ||条件。

if ( preg_match('/^\s*\--([^~]+)(~([^~]+)~)?/', $data, $matches ) && ( strpos( $data, '~' ) !== false ) )

if ( preg_match('/^\s*\--([^~]+)(~([^~]+)~)?/', $data, $matches ) || ( strpos( $data, '~' ) !== false ) )

整个代码如下。

<?php
$steps = '
--First Step ~30 mins~
First step method content goes here.
--Second Step ~10 mins~
Second step method content goes here.
--Third Step
Third step method content goes here.
';

$steps_list = explode( PHP_EOL, trim( $steps ) );

echo '<ol class="steps">';
foreach( $steps_list as $key => $data ) {

if ( preg_match('/^\s*\--([^~]+)(~([^~]+)~)?/', $data, $matches )  || ( strpos( $data, '~' ) !== false ) ) {
echo '<li>';
echo '<h4 class="step_title">' . $matches[1] . '</h4>';
    if(sizeof($matches)>2){
    echo '<span class="duration">' . $matches[3] . '</span>';
    }
} 
else{
//replacing data with span tags around it
echo $data = str_replace( $data, '<p class="decription">' . $data . '</p>', $data );
echo '</li>';
}
}
echo '</ol>';
?>

PhpFiddle.org

上试用