2013-09-22 1 views
0

У меня есть строка с привязными тегами, я отфильтровал строку и получил все привязывающие теги и значение.Замените строку словом, основанным на n-м вхождении, используя php

мой массив будет:

Array 
(
    [www.google.com] = Array 
     (
     [0]=> click here 
     [1]=> search engine 
     } 
    [http://www.gmail.com] => Array 
    (
    [0] => text1 
    [1] => 
    [2] => text2 
    [3] => 
    ) 
) 

Теперь я хочу, чтобы заменить ссылку на основывая возникновения. Здесь 0,1,2 .. представляет собой вхождение строки . Что мне делать, если я хочу заменить третье вхождение ссылки gmail.

Как заменить строку, основанную на ее возникновении? Может ли кто-нибудь помочь мне в этом?

+0

Так что, похоже, вы просматриваете полную html-страницу и захватываете привязывающие метки с помощью функции «preg_match_all»? Всегда ли замена должна быть в 3 раза? Какая у вас цель? –

ответ

0

Если я понять, что кажется, что это будет работать:

foreach(array_keys($array_of_anchors) as $anchor_text) { 
    if(count($array_of_anchors[$anchor_text]) > 2) { 
     $array_of_anchors[$anchor_text][2] = //do replace 
    } 
} 

Простой цикл поиска с помощью каждого якоря, увидеть, если есть более чем 2 вхождений, а затем делать все, что вы хотите с 2 индекса (3-е вхождение) в массиве.

0

Ваш вопрос не очень понятно, но если вы хотите, чтобы заменить * х * е вхождение строки вы можете заменить все вхождения x затем отменить x - 1. Предполагая, что $target вашей строки, $search является то, что вы ищете, и $replace является замена, то вы можете попробовать:

str_replace($search, $replace, $target, $x); 
str_replace($replace, $search, $target, ($x - 1)); 

Но будьте осторожны, это пойдет не так, если не было вхождение $replace строки уже в $target. Чтобы быть действительно безопасным, вы должны сначала проверить на $replace. Это также работает для preg_replace.

В качестве альтернативы вы можете сделать preg_match в цикле, считая совпадения и перемещая смещение вперед по строке. Затем, когда счетчик соответствует тому, что вы хотите сделать, preg_replace, чтобы заменить его.

Если вы работаете с HTML, возможно, лучше попробовать и проанализировать как структурированный документ, а не использовать поиск/замену.

+0

Извините за мое плохое объяснение. Вы правильно поняли мой вопрос. Спасибо. Но мне нужно заменить строку, основываясь на вхождении не только на последнюю, но и на другую строку с таким же $ поисковым словом, которая сильно не беспокоит, если ее значение индекса (вхождения) не сопоставляется. – user2567639

+0

OK. Можете ли вы поделиться регулярным выражением, которое вы используете, чтобы получить начальный массив и пример того, что вы хотите изменить текст (несколько, если вы хотите изменить замену каждый раз)?Возможно, вы можете просто использовать 'preg_replace' несколько раз, чтобы заменить каждое событие, но я не могу сказать это без лучшего примера. – SpaceDog

0

Я понял решение для своей проблемы, вместо этого заменив все слова поиска сразу, используя позицию смещения. Его лучше заменить один за другим последовательным образом, который помогает в решении проблемы.

protected function replaceLinkWithShortUrl($content,$toReplace,$search){ 
     $pos = strpos($content,$search); 
     $replacedContent = substr_replace($content, $toReplace, $pos).substr($content, $pos+strlen($search)); 
     return $replacedContent; 
    } 

Вышеуказанный код будет искать слово в содержании и заменять его значением и снова добавлять содержимое. Эта процедура будет повторяться до замены всех ключей поиска значениями.

Спасибо, ребята, за тех, кто помог мне в решении проблемы. Спасибо SpaceDog ..

Смежные вопросы