Удалить первый и последний экземпляр строки?

Как удалить первый экземпляр некоторого фрагмента 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 . Замените этот раздел пустым пространством (например: "")