2010-05-02 5 views
0

Еще одна проблема, с str_replace, я хотел бы изменить следующие $title данные в URL, принимая $string между числом в начале и после тире (-)str_replace между двумя числовыми строками

  1. Чикаго ' общедоступную Школы - $ 10.3M
  2. Нью-Джерси - $ 3M
  3. Мичиган: Public Health - $ 1M

Выходное желание:
чикаго-общественная школа
нового Джерси
Мичигане общественного здравоохранения

код PHP Я использую

$title = ucwords(strtolower(strip_tags(str_replace("1: ", "", $title)))); 
$x = 1; 

while ($x <= 10) { 
    $title = ucwords(strtolower(strip_tags(str_replace("$x: ", "", $title)))); 
    $x++; 
} 

$link = preg_replace('/[<>()!#?:.$%\^&=+~`*&#233;"\']/', '', $title); 
$money = str_replace(" ", "-", $link); 
$link = explode(" - ", $link); 
$link = preg_replace(" (\(.*?\))", "", $link[0]); 
$amount = preg_replace(" (\(.*?\))", "", $link[1]); 
$code_entities_match = array('&#39;s', '&quot;', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '+', '{', '}', '|', ':', '"', '<', '>', '?', '[', ']', '', ';', "'", ',', '.', '_', '/', '*', '+', '~', '`', '=', ' ', '---', '--', '--'); 
$code_entities_replace = array('', '-', '-', '', '', '', '-', '-', '', '', '', '', '', '', '', '-', '', '', '', '', '', '', '', '', '', '-', '', '-', '-', '', '', '', '', '', '-', '-', '-', '-'); 
$link = str_replace($code_entities_match, $code_entities_replace, $link); 
$link = strtolower($link); 

К сожалению, результат Я получил:

-chicagoamp9s-public-school 
2-new-jersey 
3-michigan-public-health 

У кого-нибудь есть лучшее решение для этого? Спасибо, парни!
(&#39; изменилось в amp9 - Интересно, почему?)

+0

добавил PHP тега – Eineki

ответ

0

Если я вас правильно понял:

if (preg_match('!\d+:\s+(.*)\s+-\s+\$\d+(?:\.\d+)?!', $title, $groups)) { 
    $words = strip_tags(strtolower($groups[1])); 
    $words = preg_replace('\[^\s\w]!', '', $words); 
    $words = preg_replace('!\s+!', '-', $words); 
    $words = preg_replace('!-+!', '-', $words); 
    echo $words; 
} 

одно: текст имеет "1. Чикаго ..." не «1: ... ", как кажется, ваш код. Это ошибка или что-то еще происходит?

+0

не может выяснить, есть ошибки .. – user330840

+0

спасибо за напоминание мне, теперь исходный код работает: р – user330840

0

Вы можете сделать:

$str = "1. Chicago's Public Schools - $10.3M"; 
$from = array('/^\d+\.\s+([^-]*) -.*$/','/[^A-Z ]/i','/\s+/'); 
$to = array("$1",'','-'); 
$str = strtolower(preg_replace($from,$to,$str)); 
echo $str; // prints chicagos-public-schools 
+0

это работает, но для числа 1, перезванивает к текущему URL – user330840

0

Предполагая, что вы уже извлечённых заголовков правильно, как «Государственные школы Чикаго», а затем генерировать Имена страниц из них:

function generatePagename($s) { 
    //to lower 
    $pagename = trim(html_entity_decode(strtolower($s), ENT_QUOTES)); 

    //remove 's 
    $pagename = trim(preg_replace("/(\'s)/", "", $pagename)); 

    //replace special chars with spaces 
    $pagename = trim(preg_replace("/[^a-z0-9\s]/", " ", $pagename)); 

    //replace spaces with dashes 
    $pagename = trim(preg_replace("/\s+/", "-", $pagename)); 

    return $pagename; 
} 

Что будет преобразовывать что-то вроде

Chicago&#39;s "Public": Scho-ols1+23

до

chicago-public-scho-ols1-23.

+0

Я ошибся, входные данные не являются, а ' с, где ' равно '- спасибо в любом случае – user330840

+0

Хорошо, я отредактировал ответ, чтобы соответствовать этому. Тогда вам нужно декодировать html-объекты сначала с помощью 'html_entity_decode()' – serg

+0

hmm..i сделал ярлык, хотя $ link = strtolower (strip_tags (str_replace ("amp9s", "", $ link))); Предполагая, что никакая $ title не будет иметь такую ​​ценность: p спасибо в любом случае – user330840

0
<?php 

$lines = array("1. Chicago's Public Schools - $10.3M", 
       "2. New Jersey - $3M", 
       "3. Michigan: Public Health - $1M" 
      ); 

// remove the number bullets 
$lines = preg_replace('/\ - \$\d*\.?\d*M$/', '', $lines); 

// remove the trailing dollar amount 
$lines = preg_replace('/^\d+\.\ /', '', $lines); 

// remove ignore chars 
$ignore_pattern = "/['s|:]/"; 
$lines = preg_replace($ignore_pattern, '', $lines); 

for ($i=0; $i<count($lines); $i++) { 
    $lines[$i] = implode('-',explode(' ', strtolower(trim($lines[$i])))); 
} 

print_r($lines); 

и выход:

Array 
(
    [0] => chicago-public-school 
    [1] => new-jerey 
    [2] => michigan-public-health 
) 

EDIT Start:

<?php 

$lines = array("1. Chicago's Public Schools - $10.3M", 
       "2. New Jersey - $3M", 
       "3. Michigan: Public Health - $1M", 
       "4. New York's Starbucks - $2M", 
      ); 

$lines = preg_replace('/\ - \$\d*\.?\d*M$/', '', $lines); 

$lines = preg_replace('/^\d+\.\ /', '', $lines); 

$ignore_strings = array("'s", ':'); 
for ($i=0; $i<count($lines); $i++) { 
    foreach ($ignore_strings as $s) { 
     $lines[$i] = str_replace($ignore_strings, '', $lines[$i]); 
    } 
} 

for ($i=0; $i<count($lines); $i++) { 
    $lines[$i] = implode('-',explode(' ', strtolower(trim($lines[$i])))); 
} 

print_r($lines); 

выход:

Array 
(
    [0] => chicago-public-schools 
    [1] => new-jersey 
    [2] => michigan-public-health 
    [3] => new-york-starbucks 
) 

Надеюсь, он соответствует вашим потребностям. EDIT End.

+0

[1] => new-jerey -> отсутствует s во всех выходах, спасибо в любом случае – user330840

+0

извините, надеюсь, что модификация поможет. –

+0

извините, я думаю, что вы не читали мое последнее редактирование, первые данные - это Чикаго ' s не Чикаго, очень жаль поздней коррекции: p, я сделал ярлык уже, пожалуйста, посмотрите сверху: p – user330840

0

Наконец я посмотрел на исходный код и некоторые исправления:

$title = ucwords(strtolower(strip_tags(str_replace("1. ","",$title)))); 
$x=1; 
while($x <= 10) { 
$title = ucwords(strtolower(strip_tags(str_replace("$x. ","",$title)))); 
$x++; 
} 
$data = preg_replace('/[<>()!#?:.$%\^&=+~`*&#;"\']/', '',$title); 
$urldata = str_replace(" ","-",$data); 
$data = explode(" - ",$data); 
$link = preg_replace(" (\(.*?\))", "", $data[0]); 
$budget = preg_replace(" (\(.*?\))", "", $data[1]); 
$code_entities_match = array('&quot;' ,'!' ,'@' ,'#' ,'$' ,'%' ,'^' ,'&' ,'*' ,'(' ,')' ,'+' ,'{' ,'}' ,'|' ,':' ,'"' ,'<' ,'>' ,'?' ,'[' ,']' ,'' ,';' ,"'" ,',' ,'.' ,'_' ,'/' ,'*' ,'+' ,'~' ,'`' ,'=' ,' ' ,'---' ,'--','--'); 
$code_entities_replace = array('' ,'-' ,'-' ,'' ,'' ,'' ,'-' ,'-' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'-' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'-' ,'' ,'-' ,'-' ,'' ,'' ,'' ,'' ,'' ,'-' ,'-' ,'-','-'); 
$link = str_replace($code_entities_match, $code_entities_replace, $link); 
$link = strip_tags(str_replace("amp39s","",$link)); 
$link = strtolower($link); 

Какой беспорядок, я знаю, но он работает в любом случае, спасибо, ребята за помощь мне, особенно Клетуса, который нашел ошибку между 1. и 1:

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