格式字符串像一个化学式


PHP Format string like a chemical formula

转换字符串如CO2并使其通过PHP输出CO<sub>2</sub>的最佳方法是什么?

使用preg_replace()<sub></sub>包围一组数字

$input = "CO2";
echo preg_replace('/('d+)/', '<sub>$1</sub>', $input);
// Using $input = "H2SO4";
// Prints:
H<sub>2</sub>SO<sub>4</sub>

这将正确地减去一些数字。

$s = "O2+2H2=H2O";
$len = strlen($s);
$html = '';
if($len > 0) {
    $prev = $s[0];
    $html = $prev;
    for($i=1;$i<$len;$i++){
        $ch = $s[$i];
        if(is_numeric($ch) && 'a' <= strtolower($prev) && strtolower($prev) <= 'z') {
            $html .= "<sub>$ch</sub>";
        } else {
            $html .= $ch;
        }
        $prev = $ch;
    }
}
echo $html;

打印O <子> + 2 H <子> 2 H <子> = 2子>

你知道LaTeX吗?它能很好地呈现公式。你可以在你的页面上使用

<script language="JavaScript" src="http://thewe.net/tex/textheworld6.user.js"></script>

和像这样写你的公式[;CO_2;]见这里。

  //With ions in the equation:
   // charge written like: sign  number
$s= "1H2SO4=> 2H+1 + 1SO4-2 "    ;
//$s = "1O2  +  2H2=>  2H2O";
 $len = strlen($s);
 $html = '';
  if($len > 0) {
          $prev = $s[0];
          $html = $prev;
          for($i=1;$i<$len;$i++)
          {
              $ch = $s[$i];
              if(is_numeric($ch) && 'a' <= strtolower($prev) && strtolower($prev) <= 'z') 
                {  $html .= "<sub>$ch</sub>";   }
              else 
              {
                if(($ch=="+" or $ch=="-") && '1' <= strtolower($s[$i+1]) &&  strtolower($s[$i+1]) <= '9') 
                {
                    $html .= "<sup>$ch</sup>";
                    $html .= "<sup>".$s[$i+1]."</sup>";
                    $i=$i+1; 
               }
                  else
              {
                  $html .= $ch;
              }
              $prev = $ch;
             }      
           }
        }

echo $html;

更好的方法是:

preg_replace('/([A-Z)])([0-9]+)/', ''1<sub>'2</sub>', $input)

这样你就不会有单独的<sub></sub>相邻的数字大于9(例如,<sub>12</sub>而不是<sub>1</sub><sub>2</sub>)。

函数公式($string){

    $string .= ' ';
    $len = strlen($string);
    $str_return = '';
    if($len > 0) {
        $prev       =    $string[0];
        $str_return =    $prev;
        for($i = 1; $i < $len; $i++){
            $ch = $string[$i];
            if(is_numeric($ch)){
                if('a' <= strtolower($prev) && strtolower($prev) <= 'z' || $prev == ')'){
                    if(( $string[$i+1]  == '-' || $string[$i+1]  == '+') && !in_array(@$string[$i+2], ['C', 'O', 'H'])){
                        $str_return .= '<sup>' . $ch . '</sup>';
                        $str_return .= '<sup>' . $string[$i+1] . '</sup>';
                        $i++;
                    }else{
                        $str_return .= "<sub>$ch</sub>";
                    }
                }else{
                    $str_return .= $ch;
                    $prev = $ch;
                }
            }else{
                $str_return .= $ch;
                $prev = $ch;
            }
        }
    }
    return $str_return;
}