Page 1 of 1
urlencode($title) problem when w/ is encountered
Posted: Fri Dec 11, 2009 5:01 pm
by simplyi
Hello!
I have come accross a problem when urlencode retuns not expected result. Please advise me what function to use that correctly encodes URL when characters like w/ are met?
Current usage: urlencode($title)
where $title = Small Town DJs w/ Kenzie Clarke
Expected result:
Small+Town+DJs+w%26+Kenzie+Clarke
Returned result:
Small+Town+DJs+w%26%2347+Kenzie+Clarke
Thank you very much and I am looking for your advises and support.
Re: urlencode($title) problem when w/ is encountered
Posted: Fri Dec 11, 2009 5:11 pm
by requinix
Actually the result you're expecting is with %2F not %26.
Are you sure it's not producing
Code: Select all
Small+Town+DJs+w%26%2347%3B+Kenzie+Clarke
because the HTML entity for a / is /, so
Code: Select all
$title = "Small Town DJs w/ Kenzie Clarke";
echo $title; // you see "Small Town DJs w/ Kenzie Clarke"
echo urlencode($title); // "Small+Town+DJs+w%26%2347%3B+Kenzie+Clarke"
Re: urlencode($title) problem when w/ is encountered
Posted: Fri Dec 11, 2009 5:36 pm
by simplyi
Thank you very much for your reply.
The problem is that when below urlencoded title:
$title = "Small+Town+DJs+w%26%2347%3B+Kenzie+Clarke"
is used in URL like:
events/Victoria/Small+Town+DJs+w%26%2347%+Kenzie+Clarke/190
then mod_rewrite
RewriteRule ^events/([^/]+)/([^/]+)/([^/]+) events/viewEvent.php?param_1=$1¶m_2=$2¶m_3=$3 [NC]
parses the URL differently. One / which is %26%2347% is extra!
....
so if I urlencode this - "Small Town DJs Kenzie Clarke:" I get this
"Small+Town+DJs+Kenzie+Clarke"
but if my string contains w/ then if I urlencode "Small Town DJs w/ Kenzie Clarke"
I get
Small+Town+DJs+w%26%2347%+Kenzie+Clarke which is if used in url
events/Victoria/Small+Town+DJs+w%26%2347%+Kenzie+Clarke/190 produces an error.
I try to $eventTitle = str_replace("/","/",$eventTitle);
but it does not help when w/ is encountered.
Any thoughts?
Thank you.
Re: urlencode($title) problem when w/ is encountered
Posted: Fri Dec 11, 2009 9:46 pm
by requinix
Code: Select all
$eventTitle = str_replace("/","/",$eventTitle);
First of all, remove that. It'll only bring trouble. urlencode is all you need.
I don't see what the problem is. If the title is
Small+Town+DJs+w%2F+Kenzie+Clarke then it won't interfere with the RewriteRule you posted... unless you
want the slash in there, but I really doubt it.
param_2 will be "Small Town DJs w/ Kenzie Clarke" and I was going with the assumption that's what you wanted to get.
Re: urlencode($title) problem when w/ is encountered
Posted: Fri Dec 11, 2009 11:45 pm
by simplyi
tasairis, thank you for your reply. You are right, I do not need extra '/' in the URL.
Because any extra '/' in the URL breaks my mod_rewrite pattern. So I want to allow users to input '/' in the Title field and City field which I then use as part of URL. But I need the '/' to be properly url encoded so that it is not in conflict with my mod_rewrite pattern.
May I ask you to advise me how to url encode the '/' so that if the $title has the '/' simbol it is properly url encoded and extra / does not appear in the URL.
The only solution I was able to find is:
$eventTitle = urlencode($title);
$eventTitle = str_replace("%2347","",$eventTitle);
Thank you.
Re: urlencode($title) problem when w/ is encountered
Posted: Sat Dec 12, 2009 12:35 am
by requinix
For some reason you're encoding the / twice: the first time, I don't know, and the second time through urlencode.
The first time
should not happen. That code should go away. I figured it was that one str_replace line I quoted.
So
Code: Select all
// bad
$title = "Small Town DJs w/ Kenzie Clarke";
$title = str_replace("/", "/", $title);
$title = urlencode($title);
// good
$title = "Small Town DJs w/ Kenzie Clarke";
$title = urlencode($title);
Re: urlencode($title) problem when w/ is encountered
Posted: Sat Dec 12, 2009 1:18 am
by simplyi
Thank you for your reply!
but the result of this code is a $title with '/' in it. And when used in URL of REST style like mydomain.com/events/city/venue/title/454
conflicts with mod_rewrite pattern because of additional '/' simbol.
...
Lets assume that this is our template:
Template: mydomain.com/events/city/venue/title/45
Then user inputs Event Title with several '/' characters: "Welcome to our feast the funniest/best/most interesting evening
which will make the above url look like:
URL with User input: mydomain.com/events/Vancouver/City+Hall/Welcome+to+our+feast+the+funniest/best/most+interesting+ evening/454
which conflicts with mod_rewrite template because of extra '/' and breaks php script depending on that template.
Simbols - '/' need to be encoded before use in URL.
If simbol '/' is replaced with %2F then everything works fine.
but combination of 'w/' after URLENCODE produces a result with additional '%2347' which also breaks mod_rewrite pattern and I do not understand why.
Re: urlencode($title) problem when w/ is encountered
Posted: Sat Dec 12, 2009 2:11 am
by requinix
I don't have any problems with slashes and urlencode:
Code: Select all
echo urlencode("a / b"); // a+%2F+b
Re: urlencode($title) problem when w/ is encountered
Posted: Sat Dec 12, 2009 3:36 am
by s.dot
I would just cleanse your string of any non alphanumeric characters
Code: Select all
function cleanseString($text, $lowercase=true, $strip=true, $blank='no-title', $maxlength='255', $whole_word = true)
{
if($lowercase) $text = strtolower($text);
if($strip) $text = strip_tags($text);
$text = preg_replace("/[^&a-z0-9_-\s']/i",'-',$text);
$text = str_replace(array('&',' ','\''),array(' and ','-',''),$text);
$text = trim(preg_replace("/-{2,}/",'-',$text), "-");
if(strlen($text) > $maxlength)
{
$text = substr($text,0,$maxlength);
if($whole_word)
{
$text = explode('-',$text);
$text = implode('-',array_diff($text,array(array_pop($text))));
}
}
if($text == '') return $blank;
return $text;
}
Re: urlencode($title) problem when w/ is encountered
Posted: Sun Dec 13, 2009 11:41 pm
by simplyi
Tasairis, yes, you are right. If I do
.. echo urlencode(“a / b”) then it produces an expected result on the page.
But when you put this result in URL
<a href="<?php echo urlencode('a / b')?>">Test link </a>
It results in a+/+b and I do not need this extra ‘/’ in the URL. I need it to be ‘%2f’ in browser’s address bar.
Skottayy, thank you for your reply. Is it how you usually solve urlencoding problems? Is it a proper way? I browsed for a solution and until now did not find anything that would seem as a recommended/proper way of solving these kind of situations.