2009-12-10 4 views
1

이 문제는 실제로 최근에 나를 때렸다.PHP/html의 주기적 요소 구문 분석

그래서 나는 내가 표시 할 무슨 일이 있었는지 섹션을 기반으로 XML과 방금 만든 요소와 함께 갔다 (다른 질문에 의견을 요청) 웹에 사람들의 바이오스를 올리는 임무가 주어졌다.

어떤 사람들은 자신의 바이오 수식을했고 내가 복사 할 때/서식을 붙여 것은 이상 복사하지 않았다.

내 질문은 그게 공식과 형식 그에을 구문 분석 할 수있는 쉬운 방법이 무엇입니까? 내가 가진
하나의 아이디어는 단지 숫자를 첨자했다,하지만 난 숫자가 사방에 있기 때문에이 작업을 수행 할 BBCode는 태그를 구현해야합니다. 흠, 또는 나는 숫자가 문자의 오른쪽에 있고 그 숫자를 첨자로 쓰면 감지 할 수있다.

forumlas의 일부

COO 인

나는 XML을 구문 분석 PHP를 사용 같다.

귀하의 의견은 무엇입니까?

답변

2

이 같은 아마 뭔가?

<?php 
function formatFormulas($html) 
{ 
    $regex = '/(\\s*(Ac|Ag|Al|Am|Ar|As|At|Au|Ba|Be|Bh|Bi|Bk|Br|B|Ca|Cd|Ce|Cf|Cl|Cm|Co|Cr|Cs|Cu|C|'; 
    $regex .= 'Db|Ds|Dy|Er|Es|Eu|Fe|Fm|Fr|F|Ga|Gd|Ge|He|Hf|Hg|Ho|Hs|H|In|Ir|I|Kr|K|La|Li|Lr|Lu|Md|'; 
    $regex .= 'Mg|Mn|Mo|Mt|Na|Nb|Nd|Ne|Ni|No|Np|N|Os|O|Pa|Pb|Pd|Pm|Po|Pr|Pt|Pu|P|Ra|Rb|Re|Rf|Rg|Rh|'; 
    $regex .= 'Rn|Ru|Sb|Sc|Se|Sg|Si|Sm|Sn|Sr|S|Ta|Tb|Tc|Te|Th|Ti|Tl|Tm|Uub|Uuh|Uuo|Uup|Uuq|Uus|Uut|'; 
    $regex .= 'U|V|W|Xe|Yb|Y|Zn|Zr)\\s*(<[^>]+>)*\\s*\\d*\\s*(<[^>]+>)*\\s*)+/'; 
    if (preg_match_all($regex, $html, $m)) { 

     for ($i = 0; $i < count($m[0]); $i++) { 

      $replace = preg_replace('/\\s+/', "", $m[0][$i]); 
      $replace = preg_replace('/<[^>]+>/', "", $replace); 
      $replace = preg_replace('/\\d+/', '<sub>$0</sub>', $replace); 
      $leading = preg_replace('/^(\\s*)[\\S\\s]*/', '$1', $m[0][$i]); 
      $trailing = preg_replace('/^[\\S\\s]*?(\\s*)$/', '$1', $m[0][$i]); 
      $replace = $leading . $replace . $trailing; 
      $html = str_replace($m[0][$i], $replace, $html); 

     } 

    } 

    return $html; 
} 
?> 
+0

감사합니다! 나는 그것을 오늘 시험해보고 그것이 작동한다면 대답으로 표시 할 것이다 :). –

+0

주기 표에서 요소를 찾고 있습니다 (현재 대소 문자를 구분하며 원하는 경우 변경하기 쉽습니다). 선택적 공백, 선택적 HTML 태그, 선택적 공백, 선택적 숫자 선택적 공백, 선택적 HTML 태그, 선택적 공백 - 그런 다음 그것의 반복 (즉 일련의 공백). 그런 다음 내부 공백을 제거하고 숫자를 태그에 배치합니다. – SoaperGEM

+0

언급하는 것을 잊었다 - 그것은 또한 HTML 꼬리표를 역시 벗긴다. CSS로 포맷 할 수있는 일종의 특수 태그로 모든 것을 싸고 싶다면, 18 번째 줄을 '$ replace = $ leading로 바꿀 수 있습니다. ''. $ 대체하십시오. ''. $ trailing;' – SoaperGEM