转换字符串如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;
}