2014-12-26 2 views
1

Я пытаюсь преобразовать все значения в url в нижний регистр и дефис. однако, когда он преобразуется в нижний регистр и дефис, он не собирает запись, иначе он собирает штраф с% 20. я бы хотел, чтобы ваши отзывы были правильными, или что-то еще мне нужно сделать. Я проверил php и массивы, и они кажутся мне прекрасными.после преобразования в нижний регистр и дефис, запись не собрана


example.com/user/kate/baked/cake> переходит на страницу описания


example.com/user/kate/baked/Lovely%20Chocolate%20Cake> переходит на страницу описания


example.com/user/kate/baked/lovely-chocolate-cake> это не идет на странице описания (это когда я использую код для преобразования в нижний регистр и дефис)


Код Ниже

HTAccess

RewriteRule ^user/.*[A-Z\ ] linkchange.php?l=%{REQUEST_URI} [L]

RewriteRule ^user/([a-z]+)/baked/([a-z.*0-9_-]+)$ cakes.php?id=$1&baked=$2

ссылка изменение PHP

<? $link = $_GET['l']; $newlink = strtr($link," ABCDEFGHIJKLMNOPQRSTUVWXYZ","-abcdefghijklmnopqrstuvwxyz"); header("Location: http://www.example.com". $newlink,TRUE,301); exit; ?>

** торты PHP ** `

<?php 
$cakesmade = array(); 
$cakesmade = array(
"kate" => array(
"cake" => array(
"cakeingredients" => "egg, flour"), 
"Lovely Chocolate Cake" => array(
"cakeingredients" => "chocolate, eggs, flour"), 
"amazing cake" => array(
"cakeingredients" => "lemons, flour") 
), 
); 




?> 
<?php foreach($cakesmade as $id => $donecake) 
foreach($donecake as $bakedcake => $description) 
{ echo "<a href='user/$id/baked/{$bakedcake}'>{$bakedcake}</a><br>"; 
} 
?> 


// this part should appear once the user and variable are set in the url 
The selected cake is: <?php if(isset($bakedcake)) { echo $bakedcake; } else { echo "not set"; } ?> by <?php if(isset($id)) { echo $id; } else { echo "not set"; } ?>` 

благодаря croisés до сих пор за то, чтобы помочь мне понять вещи.

ответ

0

Давайте предположим, что у вас есть ссылка, как это:

$str = example.com/user/kate/baked/Lovely%20Chocolate%20Cake 
// we'll need to decode the URL like so : 
$url = urldecode($str); 
// then, replace lowercase and replace all spaces with dashes 
$url = strtolower($url); 
$url = str_replace(' ', '-', $url); 

Я предполагаю, что должен это сделать.

+0

спасибо, это гораздо более простой способ преобразования в нижний регистр. этот ресурс интенсивный, если сказать, что это внутри цикла foreach? проблема, связанная с тем, что после преобразования URL в нижний регистр значение в массиве по-прежнему остается заглавным «Lovely Chocolate Cake», я пытаюсь его собрать, хотя URL-адрес теперь в нижнем регистре. Есть ли способ обойти это? и является ли он ресурсоемким? – user3108623

+0

извините за поздний ответ, конечно, значение в массиве не изменится, потому что мы применяем strtolower по значению ссылки, а не к массиву, если вы хотите, чтобы в нижнем регистре все значения массива вы могли использовать array_map (см. руководство: http://php.net/manual/en/function.array-map.php), но я вижу, что вы тоже используете ключ ассоциативного ключа, поэтому я думаю, что самый простой способ уменьшить регистр ключей находится в цикле, или вы можете проверить функцию array_reduce. – teeyo

+0

И, говоря о ресурсах, конечно, меньше функций означает меньшее использование памяти и меньшее время выполнения, но мы не должны обсуждать проблемы оптимизации или эффективности, если нет реальной проблемы, попытайтесь реализовать решение и посмотрите, достаточно ли он для вас, если а не начинать думать об оптимизации. Удачи. – teeyo

0

Во-первых, удалите первый '/' из правил перезаписи. Далее, сделать работу PHP немного легче, изменив первое правило.

RewriteRule ^user/([^/]+)/baked/(.*[A-Z\ ].*)$ linkchange.php?user=$1&cake=$2} [L]
RewriteRule ^user/([a-z]+)/baked/([a-z.*0-9_-]+)$ cakes.php?id=$1&baked=$2

Ваш код изменение ссылка становится:

<?php 
    $user = $_GET['user']; 
    $cake = $_GET['cake']; 

    $cake = urldecode($cake); 
    $cake = strtr($cake," ABCDEFGHIJKLMNOPQRSTUVWXYZ","-abcdefghijklmnopqrstuvwxyz"); 
    header("Location: http://www.example.com/user/$user/baked/$cake", TRUE, 301); 
    exit; 
?> 
Смежные вопросы