Как удалить первый экземпляр некоторого фрагмента html из строки.
Я ищу удалить
</tr> </table></td> </tr
который близок к началу, но он также появляется по всей струне.
Мне также нужен способ сделать то же самое, но последний экземпляр этого.
Кто-нибудь знает?
если вы точно знаете, как близко к концу строки подстрока, которую вы хотите заменить, вы используете substr_replace()
с отрицательными параметрами $start
и $length
, или вы можете просто substr_replace()
функцию вручную, чтобы фактически пройти , найдите последнее вхождение, а затем удалите его. что-то вроде этого (непроверено, написано очень быстро):
function replace_last_occurrence($haystack, $needle) { $pos = 0; $last = 0; while($pos !== false) { $pos = strpos($haystack, $needle, $pos); $last = $pos; } substr_replace($haystack, "", $last, strlen($needle)); }
аналогично, для первого случая
function replace_first_occurrence($haystack, $needle) { substr_replace($haystack, "", strpos($haystack, $needle, $pos), strlen($needle)); }
вы могли бы также обобщить это, чтобы заменить n-й случай:
function replace_nth_occurrence($haystack, $needle, $n) { $pos = 0; $last = 0; for($i = 0 ; $i <= $n ; $i++) { $pos = strpos($haystack, $needle, $pos); $last = $pos; } substr_replace($haystack, "", $last, strlen($needle)); }
Простейший способ – взорвать / разделить строку, сдвинуть верхнюю часть и всплыть последним, затем взорвать то, что осталось с вами, разделитель и объединить три. То есть:
$separator = 'your specified html separator here'; $bits = explode($separator , $yourhtml ); $start = array_shift($bits); $end = array_pop($bits); $sorted = $start . implode($separator,$bits) . $end;
(не испытано)
Это удалит последнее событие:
$needle = <<<EON </tr> </table></td> </tr EON; if(preg_match('`.*('.preg_quote($needle).')`s', $haystack, $m, PREG_OFFSET_CAPTURE)) { $haystack = substr_replace($haystack, '', $m[1][1], strlen($m[1][0])); }
В качестве дополнительного бонуса вы можете игнорировать различное количество пробелов в найденном фрагменте, например:
if(preg_match('`.*('.implode('\s+', array_map('preg_quote', preg_split('`\s+`', $needle))).')`s', $haystack, $m, PREG_OFFSET_CAPTURE)) { $haystack = substr_replace($haystack, '', $m[1][1], strlen($m[1][0])); }
Или даже поиск без учета регистра, добавив i-flag в regexp:
if(preg_match('`.*('.implode('\s+', array_map('preg_quote', preg_split('`\s+`', $needle))).')`is', $haystack, $m, PREG_OFFSET_CAPTURE)) { $haystack = substr_replace($haystack, '', $m[1][1], strlen($m[1][0])); }
Вам будет нужно str_replace . Замените этот раздел пустым пространством (например: "")