Aklıma gelen ilk çözüm bu gibi görünüyor:
- tüm kodları çıkarmak
- Dizenizin manipülasyonlar etkilenmez olmayacak özel bir işaretleyici ile bunların yerine, kodları kaldırmak - ki işaretleyici gerçekten özel olmak zorundadır (ve bunu btw, giriş dizesi mevcut değil doğrulamak olabilir)
- dize üzerinde manipülasyonlar yapmak
- belirteçleri artık var kodları, geri koymak
In code, it could be something like this :
(sorry, it's quite long -- and I didn't include any check ; it's up to you to add those)
$str = <<<A
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec sodales lacus et erat accumsan consectetur. Sed lacinia enim vitae erat suscipit fermentum. Quisque lobortis nisi et lacus imperdiet ac malesuada dui imperdiet. <pre><code>ThIs Is
CoDe 1</code></pre>Donec vestibulum commodo quam rhoncus luctus. Nam vitae ipsum sed nibh dignissim condimentum. Sed ultrices fermentum dapibus. Vivamus mattis nisi nec enim convallis quis aliquet arcu accumsan. Suspendisse potenti. Nullam eget fringilla nunc. Nulla porta justo justo. Nunc consectetur egestas malesuada. Mauris ac nisi ipsum, et accumsan lorem. Quisque interdum accumsan pellentesque. Sed at felis metus. Nulla gravida tincidunt tortor, <pre><code>AnD cOdE 2</code></pre>nec aliquam tortor ultricies vel. Integer semper libero eu magna congue eget lacinia purus auctor. Nunc volutpat ultricies feugiat. Nullam id mauris eget ipsum ultricies ullamcorper non vel risus. Proin volutpat volutpat interdum. Nulla orci odio, ornare sit amet ullamcorper non, condimentum sagittis libero. <pre><code>aNd
CoDe
NuMbEr 3
</code></pre>Ut non justo at neque convallis luctus ultricies amet.
A;
var_dump($str);
// Extract the codes
$matches = array();
preg_match_all('#<pre><code>(.*?)</code></pre>#s', $str, $matches);
var_dump($matches);
// Remove the codes
$str_nocode = preg_replace('#<pre><code>.*?</code></pre>#s', 'THIS_IS_A_NOCODE_MARKER', $str);
var_dump($str_nocode);
// Do whaterver you want with $str_nocode
$str_nocode = strtoupper($str_nocode);
var_dump($str_nocode);
// And put back the codes :
$str_codes = $str_nocode;
foreach ($matches[0] as $code) {
$str_codes = preg_replace('#THIS_IS_A_NOCODE_MARKER#', $code, $str_codes, 1);
}
var_dump($str_codes);
Ben denedim:
- bir satırda kod,
- 2 satır kodu,
- ve birden fazla satır kodu
Not: Eğer gerçekten daha yaptım daha test etmelisiniz - ama bu size bir ilk fikir verebilir ...
Bu :-) yardımcı olur umarım
Bir yan not olarak: genellikle regexes ile HTML ayrıştırma kötü uygulama olarak kabul edilir ve genellikle Belki DOMDocument::loadHTML
a> bir göz değer olan bir fikir olabilir gibi bir şey kullanarak ... sıkıntılara yol açar?