我有一个字符串,其中包含匹配的分组模式和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>
我做错了什么?
答案 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>';
?>
上试用