php preg_replace for text以*开头。并以\ r或\ n结束

时间:2012-11-16 08:39:17

标签: php regex

我在php中有2个文本字符串,我想将它们更改为html标签

首先:

*.some text
* some text

和第二:

#.sometext
# sometext

我想将以'*.' or '* '开头的第一个字符串更改为<li>,并将'\r''\n'更改为</li>

我希望将以'#.' or '# '开头的第二个字符串更改为<ol>,然后将'\r''\n'更改为</ol>

我写了这个正则表达式代码但不起作用:

$regex1 = "#([*.])(.*)([\n])#e";
$text = preg_replace($regex1,"('<li>$2</li>')",$text);

$regex2 = "#([#.])(.*)([\n])#e";
$text = preg_replace($regex2,"('<ol>$2</ol>')",$text);

我该怎么办?

非常感谢

2 个答案:

答案 0 :(得分:0)

我建议您对代码进行一些更改,我将在下面解释。

首先是代码:

<?php
$text = "
first :

*.some text
* some text

and second :

#.sometext
# sometext
";

$regex1 = "#\*(.| )(.*?)\n#";
$text = preg_replace($regex1,"<li>$2</li>\n",$text);

$regex2 = "#\#(.| )(.*?)\n#";
$text = preg_replace($regex2,"<ol>$2</ol>\n",$text);

echo $text;

和输出

first :

<li>some text</li>
<li>some text</li>

and second :

<ol>sometext</ol>
<ol>sometext</ol>

的变化:

  • 您无需在正则表达式中使用e修饰符
  • 为了匹配*.*,只需指定*(转义为\*,并指定.的OR条件(转义为{{} 1}})和\.
  • 使用非贪婪版本的,即.*,以便您只吃尽可能少的文字。

PS:这可能不是你想要的(ol有这个结构:.*?,但我把代码编写到你的问题规范中。你应该可以修改它。

答案 1 :(得分:0)

$str=<<<STR
abc
*.some text
* some text
def
STR;

echo preg_replace('/[\r\n]+<\/li>/i',"</li>",preg_replace('/\*[\.\s](.*)$/im',"<li>$1</li>",$str));

以上将输出:

abc
<li>some text</li>
<li>some text</li>
def

可以做出类似的改变来完成你的第二个要求。

我使用两个正则表达式的原因是,如果你的字符串看起来像

$str=<<<STR
abc
*.some text
* some text
STR;

没有最后一行,所以最后一行可能不匹配。所以我使用m修饰符和$来匹配每个行尾。

但测试结果显示仅使用$将最终结果如下:

abc
<li>some text
</li>
<li>some text</li>

为了避免这种情况,我添加了另一个正则表达式来修复[newline]</li>