php正则表达式匹配动态字符串中的代数方程

时间:2016-02-08 05:41:53

标签: php regex

我有以下字符串

3<em>a +</em> 2<em>b</em>

2<em>a </em> - 2<em>b</em>

我希望将它们转换为以下

3 a + 2 b

2 a - 2 b

字符串可能有也可能没有<em></em>个标签

基本上我需要从动态字符串中解析代数方程。

以下是代码应考虑的一些情况:

2<em>a </em>- (<em>a </em>- 2<em>b)</em>
<em>a&nbsp;</em>- 2<em>b</em>
<em>a </em>+&nbsp;2<em>b</em>
3<em>a +</em>&nbsp;2<em>b</em>
(<em>p</em>&nbsp;+ 2)
(<em>p</em>&nbsp;- 3)
<em>not an algebraic equation. tags should not be truncated.</em>

我尝试使用正则表达式来匹配上面的字符串,但可以&#39; nt。

PHP代码:

$string = "3<em>a +</em> 2<em>b</em>";
$pattern = '#(\d{0,9}<em>a.*</em>)#';
preg_match($pattern, $string, $matches);
echo json_encode($matches);

在模式中,我尝试匹配a内的<em></em>前面有一个数字。

编辑:我无法使用strip_tags或相关逻辑截断<em></em>,因为我的内容是动态的,我只想在匹配为 代数方程式< / EM>

9 个答案:

答案 0 :(得分:1)

您可以使用strip_tags删除 HTML 标记:

$string = "3<em>a +</em> 2<em>b</em>";
echo strip_tags($string);

// second string
$string2 = "2<em>a </em> - 2<em>b</em>";
echo strip_tags($string2);

<强>结果:

3a + 2b
2a - 2b

<强>更新

如果模式匹配则删除标签:

<?php
$string = "2<em>a </em> - 2<em>b</em>";
$pattern = '#(\d{0,9}<em>a.*</em>)#';
if(preg_match($pattern, $string, $matches)){
    echo strip_tags($matches[0]);
}
?>

答案 1 :(得分:1)

var canvas = document.getElementById(canvasId); 
canvas.width = width; 
canvas.height = height;

答案 2 :(得分:1)

试试这个

    <?php
$string = "2<em>an&nbsp;</em> - 2<em>a</em>";
$pattern = '#(\d{0,9}<em>[a-zA-Z].*</em>)#';
if(preg_match($pattern, $string, $matches)){
    $a=strip_tags($matches[0]);
    echo str_replace('&nbsp;','',$a);
}
?>

答案 3 :(得分:1)

你可以试试这个,

<?php $string = "3<em>a +</em> 2<em>b</em>";
$pattern = '/^\d<em>\w\s\S<\/em>\s\d<em>\w<\/em>$/';
preg_match($pattern, $string, $matches);
print_r($matches);
?>

答案 4 :(得分:1)

您可以使用以下方法,请参阅a demo on ideone.com

<?php
$string = "2<em>a </em>- (<em>a </em>- 2<em>b)</em>
<em>a&nbsp;</em>- 2<em>b</em>
<em>a </em>+&nbsp;2<em>b</em>
3<em>a +</em>&nbsp;2<em>b</em>
(<em>p</em>&nbsp;+ 2)
(<em>p</em>&nbsp;- 3)";

$regex = '~(</?[^>]+>|&nbsp;)~';
# looks for html tags (open and closing tags) or &nbsp; literally

$string = preg_replace($regex, "", $string);
echo $string;
// output:
// 2a - (a - 2b)
// a- 2b
// a +2b
// 3a +2b
// (p+ 2)
// (p- 3)
?>

演示:

Regex101ideone
不过,为什么strip_tags()不是一个选项?

答案 5 :(得分:1)

假设您要提取这些方程式。对我来说,目前还不清楚你的实际目标是什么。

1。)使用[\d)(]*(?:</?em>[^><\r\n]*)+之类的内容来提取包含<em ...的行 See demo at regex101。这只是为了获取线条。

2。)删除标签和&nbsp;并检查线条是否看起来像一个等式,例如检查是否至少可以是算术运算符[*/+-]和数字\d在它。

if(preg_match_all('~[\d)(]*(?:</?em>[^><\r\n]*)+~', $str, $out))
{
  foreach($out[0] AS $v)
  {
    $v = preg_replace(['~</?em>~', '~&nbsp;~'], ["", " "], $v);
    if (preg_match('~[*/+-]~', $v) && preg_match('~\d~i', $v))
      $eq[] = $v;
  }
}

您当然可以更好地改进检查以识别方程式。 See demo at eval.in

答案 6 :(得分:0)

为什么不搜索和替换<em></em>的所有实例?

$string = "3<em>a +</em> 2<em>b</em>";

$string = str_replace("<em>", "", $string);
$string = str_replace("</em>", "", $string);

echo $string; //3a + 2b

答案 7 :(得分:0)

PHP有一个函数strip_tags来从字符串中删除HTML标记。你可以使用它。

$string = "3<em>a +</em> 2<em>b</em>";
echo strip_tags($string);

答案 8 :(得分:0)

<GridView ItemsSource="{x:Bind ViewModel.SoundEffects}">
    <GridView.ItemTemplate>
        <DataTemplate x:DataType="data:SoundEffectButton">
            <Button Style="{StaticResource defaultButton}"
            Content="{Binding Name}"
            Tag="{Binding FileName}"
            Command="{x:Bind Play}"
            CommandParameter="{Binding FileName}" />
        </DataTemplate>
    </GridView.ItemTemplate>
</GridView>