2010-12-28 5 views
2

Я хочу, чтобы первое слово строки было окружено тегами. Введенный с моим кодом, все слова окружены им.Easy PHP Replace

Код предназначен для wordpress, поэтому the_title является заголовком сообщения. Например. Привет мир. Я хочу, чтобы это было <span>Hello </span>World.

<?php 
$string = the_title('', '', false); 
$pattern = '^(\S+?)(?:\s|$)^'; 
$replacement = '<span>$1</span>'; 
$string = preg_replace($pattern, $replacement, $string); 
?> 

      <h2><a href="<?php the_permalink(); ?>"><?=$string?></a></h2> 

Извините за мой плохой английский :)

МОЕ РЕШЕНИЕ:

<?php 
$string = the_title('', '', false); 
$pattern = '/\S+/'; 
$replacement = '<span>$0</span>'; 
$string = preg_replace($pattern, $replacement, $string, 1); 
?> 

      <h2><a href="<?php the_permalink(); ?>"><?=$string?></a></h2> 
+0

Могу ли я спросить, почему вы используете preg_replace и не простой SUBSTR/взрываются? Я что-то пропустил с тем, что вам нужно извлечь? –

+0

Я не знаю других способов сделать это. Я долго искал и нашел сценарий jquery, и просто взял шаблон из него и вместо этого получил его в php-скрипте. – Nicole

+1

Не редактируйте заголовок вопроса, чтобы отметить его как «Разрешенный». Выберите лучший ответ вместо этого!(Нажмите галочку рядом с лучшим ответом). – netcoder

ответ

1

Попробуйте ограничить число замен к 1 пропусканием 1 в качестве 4-го аргумента preg_replace как:

$string = preg_replace($pattern, $replacement, $string,1); 
                 ^^ 

Лучше регулярное выражение, чтобы найти слово будет использовать границы слов:

$pattern = '/\b(\w+)\b/'; 

, но таким образом, вы будете иметь, чтобы ограничить замену к 1 снова.

В качестве альтернативы вы можете просто соответствовать первое слово как:

$pattern = '/^\W*\b(\w+)\b/'; 

и просто использовать preg_replace без ограничения количества замен.

ПРИМЕЧАНИЕ: = [a-zA-Z0-9_] Если ваше слово разрешено иметь другие символы, измените его соответствующим образом. Если вы считаете какое-либо не-пробельное слово в качестве символа слова, вы можете использовать \S.

+0

Спасибо! Спасибо! Вы удивительны :) – Nicole

+0

Я изменил схему на это: $ pattern = '/ \ S + /'; – Nicole

0

Вы должны обновить шаблон и замена, как это (это игнорирует первые пробелы в начале):

<?php 

$string = the_title('', '', false); 
$pattern = "^(\\s*)(\\S+)(\\s*)(.*?)$"; 
$replacement = '<span>$2</span>'; 
$string = preg_replace($pattern, $replacement, $string); 
0

PCRE не нужно в этом случае. Вы могли бы сделать то же самое с простым substr/strpos комбинации (которая должна, хотя минимально, быстрее):

$str = 'Hello World'; 

$endPos = strpos($str, ' ')+1; 
$str = '<span>'.substr($str, 0, $endPos).'</span>'. 
     substr($str, $endPos); 
echo $str; 

Если вы действительно хотите идти с тем, как PCRE, вы можете сделать:

$str = preg_replace('/^([^\s]+\s)/', '<span>\1</span>', $str); 

Оператор не требует $limit, так как шаблон начинается с ^ (начало строки), который не является разделителем, в отличие от вашего.

0

$string = '"' . substr($string, 0, strpos($string, ' ')) . '"'; должен сделать трюк!

1

Используйте что-то вроде следующего: операции

$string = "Hello World"; 
$val = explode(" ", $string); 
$replacement = '<span>'.$val[0].' </span>'; 
for ($i=1; $i < count($val); $i++) { 
    $replacement .= $val[$i]; 
} 
echo "$replacement"; 
+1

Вы могли бы сделать: '$ val = explode ('', $ string, 2); $ string = ''. $ val [0]. ' '. $ Val [1]; 'Третий параметр - вот что здесь делает разницу. – netcoder

+0

Ahhh, спасибо за это. – atx