İlk şeyler ilk: Ne this, this, this, ne this sorumu yanıtladı. Yani bir yenisini açacağım.
Please read
Tamam, tamam. I know regexes genel HTML ayrıştırmak için bir yol olmadığını. Oluşturulan belgeler sınırlı, kontrollü bir HTML alt kümesi kullanılarak yazılır Unutmayınız. Ve dokümanlar yazma insanlar ne yaptığınızı biliyorum. Onlar tüm BT uzmanları vardır!
Kontrollü sözdizimi is mümkün belgeleri ayrıştırmak Verilen ben burada Regexes kullanarak var.
Ben web keyfi belgeleri indirmek ve onları ayrıştırmak çalışıyorum değilim!
Ve eğer does belge düzenlenmiş olması, başarısız, bu nedenle ayrıştırmak olacak ayrıştırma. Ben burada sesleniyorum sorunu (yani diğer iki desenleri içinde desenleri yerini) bundan daha geneldir.
A little bit of background (you can skip this...)
Bizim ofiste bizim belgeleri "güzel yazdırmak" gerekiyor. Bu nedenle neden bazı Word belgeleri içine koyarak geldi. Şimdiye kadar oldukça henüz minnetle değiliz. Ben bu halletmek Ve eğer biz gerek olmayabilir.
The current state (... and this)
Docs ana parçası, bir TikiWiki veritabanında saklanır. Ben PDF (LaTeX ile) HTML belgeleri dönüştürür aptal PHP komut dosyası oluşturduk. Seçilen Wiki-Sistemi must have özelliklerinden biri WYSIWYG editörü oldu. Hangi, beklendiği gibi resmi DOM sonra daha az olan belgeler bize bırakır.
Sonuç olarak, ben "basit" Regexes kullanarak belgeyi transliterating ediyorum. Hepsi şimdiye kadar işleri (çoğunlukla) ince, ama ben henüz kendi başıma çözemedim bir sorunla karşılaştı.
The problem
Bazı özel karakterler LaTeX biçimlendirme yerini gerekir. Exaple için, \
karakter $\backslash$
(birisi, başka bir çözüm bilen sürece?) Tarafından değiştirilmesi gerekir.
Except a verbatim
bloke ederken!
I-verbatim
bölümleri ile <code>
etiketler yerine yok. Bu code
blok backslash'lar (Windows klasör adları için olduğu gibi) içeriyorsa, ancak, komut hala bu backslash'lar değiştirir.
Ben negatif geriye ilerleme ve / veya LookAheads kullanarak bu çözebilir herhalde. Ama benim girişimleri işe yaramadı.
Verilen, gerçek bir çözümleyici ile daha iyi olurdu. Aslında, benim "in-beyin-yol haritası" üzerinde bir şeydir, ama currently kapsamı dışındadır. Komut bizim sınırlı bilgi alanı için yeterince iyi çalışıyor. Bir ayrıştırıcı oluşturma bana sıfırdan hemen hemen başlamak için gerektirir.
My attempt
Example Input
The Hello \ World document is located in:
<code>C:\documents\hello_world.txt</code>
Expected output
The Hello $\backslash$ World document is located in:
\begin{verbatim}C:\documents\hello_world.txt\end{verbatim}
Bu şimdiye kadar ile gelebilir en iyisi:
<?php
$patterns = array(
"special_chars2" => array( '/(?<!<code[^>]*>.*)\\\\[^$](?!.*<\/code>)/U', '$\\backslash$'),
);
foreach( $patterns as $name => $p ){
$tex_input = preg_replace( $p[0], $p[1], $tex_input );
}
?>
Bu sadece bir alıntıdır, ve [^$]
başka bir LaTeX gereksinimi olduğunu unutmayın.
Başka bir girişimi olan seemed çalışmak için:
<?php
$patterns = array(
"special_chars2" => array( '/\\\\[^$](?!.*<\/code>)/U', '$\\backslash$'),
);
foreach( $patterns as $name => $p ){
$tex_input = preg_replace( $p[0], $p[1], $tex_input );
}
?>
... Diğer bir deyişle: Negatif Geriye İlerleme dışarıda bırakarak.
Ama bu daha fazla hata eğilimli Geriye bakan ve ileri yönlü hem de daha görünüyor.
A related question
Sizin de fark etmiş olabileceğiniz gibi, desen ungreedy olan (/.../U
). Bir <code>
bloğunun içine Yani bu maç sadece az mümkün olacak? Göz-arounds göz önüne alındığında?