1

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

第一的 :

*.some text
* some text

第二:

#.sometext
# sometext

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

我想更改以'#.' or '# 'to开头并以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);

我该怎么办?

多谢

4

2 回答 2

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在正则表达式中使用修饰符
  • 为了匹配*.and *,只需指定*(escaped to ,以及(escaped to ) and\*的 OR 条件。.\.
  • 使用 的非贪婪版本.*,即.*?你只吃尽可能少的文本。

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

于 2012-11-16T09:06:12.877 回答
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;

不会有 last-newline,所以最后一行可能不匹配。所以我使用m修饰符,并$匹配每个行尾。

但是测试结果显示 using only$会变成这样:

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

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

于 2012-11-16T09:28:40.670 回答