Удалить первый и последний экземпляр строки? - PullRequest
1 голос
/ 30 июня 2010

Как я могу удалить первый экземпляр определенного фрагмента html из строки.

Я хочу удалить

      </tr>
    </table></td>

  </tr

, который близок к началу, но он также появляется по всей строке.

Мне также нужен способ сделать то же самое, но последний экземпляр этого.

Кто-нибудь знает?

Ответы [ 4 ]

2 голосов
/ 30 июня 2010

если вы примерно знаете, как близко к концу строки находится подстрока, которую вы хотите заменить, вы используете substr_replace() с отрицательными параметрами $start и $length, или вы можете просто закодировать функцию с помощьюруку, чтобы на самом деле пройти, найти последнее вхождение, а затем удалить его.что-то вроде этого (не проверено, написано очень быстро):

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));
}
1 голос
/ 30 июня 2010

Это удалит последнее вхождение:

$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 в регулярное выражение:

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]));
}
1 голос
/ 30 июня 2010

Самый простой способ - это взорвать / разбить строку, сдвинуть верхнюю и вытолкнуть последнюю, затем взорвать то, что осталось с вашим разделителем, и объединить три .. т.е.1004 *

0 голосов
/ 30 июня 2010

Вам понадобится str_replace . Замените этот раздел пустым пробелом (например: "")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...