Small issue with str_replace - php

This is my code:
$produrl = '/'. basename(str_replace(".html","",$_cat->getUrl())) .'/' . basename($_product->getProductUrl()) ;
$_cat->getUrl() returns this:
http://website.com/category/subcategory.html
I need: for $produrl part of basename(str_replace(".html","",$_cat->getUrl()))to return category/subcategory
The issue:
It gives back only category without /subcategory I know the issue is in the str_replace it's wrong isn't? Can you help me with that?
Pleast Note I have 2 Cases:
Sometimes I get http://website.com/category/subcategory.html.
Sometimes http://website.com/category.html
And I would like it to work with both of them :)

You should use parse_url instead:
$url = parse_url($_cat->getUrl());
$produrl = str_replace(".html","",$url['path']);

The problem is that you're using the basename() function.
Take a look at the documentation for it: http://php.net/manual/en/function.basename.php
It will only return the trailing string after the "/" (forward slash) or "\" (back slash, for Windows).

Related

Remove slash from final string and GET

So earlier I was using http://localhost/profile.php?username=joe but now I'm using htaccess to make the URL look nice, so this is what it now looks like http://localhost/joe. Now here's the issue, before I did this
$username = $_GET['username'];
And then use it to get the username, but now how would I do it? I've seen other posts, but they seem to use longer and more complex URLs.
I can do this
$url = 'http://localhost/joe';
echo parse_url($url, PHP_URL_PATH);
And it seems to work fine, but I get a / before the actual result so I get /joe, and I want joe. I've also tried stripslashes but that didn't seem to work. So any ideas?
Trim the result on the left site to avoid removing or replacing slashes that are part of the actual value.
$result = ltrim($path, '/');
You can also use explode and array_pop.
$url = 'http://localhost/joe';
echo array_pop(explode("/", $url))
Use str_replace(). Like this
$url = 'http://localhost/joe';
$final = parse_url($url, PHP_URL_PATH);
$result = str_replace('/','',$final);
echo $result;
stripslashes() works for backward slashes, not forward slashes
Just a substr call should also work:
$url = 'http://localhost/joe';
echo substr(parse_url($url, PHP_URL_PATH), 1); // joe
You can learn about placeholders in routes. Try this article
Route Parameters
Route parameters can be used to insert placeholders into your route definition. This will effectively create a pattern in which URI segments can be collected and passed to the application’s logic handler.
This might sound a little confusing, but when you see it in action everything will fall into place. Here we go...
<?php
// app/routes.php
// routes for the books section
Route::get('/books', function()
{
return 'Books index.';
});
Route::get('/books/{genre}', function($genre)
{
return "Books in the {$genre} category.";
});
Also there is basename()
echo basename('http://localhost/joe'); //joe
It's better to use this rule or mod proxy to rewrite REQUEST_URI:
RewriteCond %{REQUEST_URI}
Then you can get your parameter and remove its slashes easily with trim($_SERVER['REQUEST_URI'],'/').

How to convert this url to %20?

A very simple problem which might have been solved here a lot of time, but I'm not getting what I want.
I have an image url like this:
$image = 'http://perfumepalace.arctechsolution.com/image/cache/data/another/For Her/Believe 100ml EDP-150x150.jpg';
and want output in this form
http://perfumepalace.arctechsolution.com/image/cache/data/another/For%20Her/Believe%20100ml%20EDP-150x150.jpg
Yes ofcourse you will tell me I can use urlencode or rawurlencode. Believe me I've tried and still no luck.
With urlencode I get like this
http%3A%2F%2Fperfumepalace.arctechsolution.com%2Fimage%2Fcache%2Fdata%2Fanother%2FFor+Her%2FBelieve+100ml+EDP-150x150.jpg
And with rawurlencode I received output like this:
http%3A%2F%2Fperfumepalace.arctechsolution.com%2Fimage%2Fcache%2Fdata%2Fanother%2FFor%20Her%2FBelieve%20100ml%20EDP-150x150.jpg
With str_replace I can get exactly what I want like this:
str_replace('+', '%20', $image);
will result: http://perfumepalace.arctechsolution.com/image/cache/data/another/For%20Her/Believe%20100ml%20EDP-150x150.jpg
but I want to get them using urlencode or rawurlencode. But these functions encode even slash / part as well.
Is there any way to url encode only spaces in the url?
Edit: Yes i can use basename() or pathinfo to encode only part of the url. But the directory name might also contain the space character, so converting only filename is also not a possibility here.
And actually I want to know if we can use urlencode, or rawurlencode in full url without affecting the '/' of the fullurl. I don't want the regex suggestions eigher.
Note: The complication part is that 'For Her' directory section in the url path, and the level of directory is also not fixed.
What you need is rawurlencode(), but only encode the necessary part of your url.
Example:
$image = sprintf(
'http://perfumepalace.arctechsolution.com/image/cache/data/another/%s/%s',
rawurlencode('For Her'),
rawurlencode('Believe 100ml EDP-150x150.jpg')
);
But if you still want to apply to the whole url string, you could do like below:
function my_url_encode($url) {
$info = parse_url($url);
return sprintf('%s://%s/%s',
$info['scheme'],
$info['host'],
implode('/', array_map('rawurlencode', explode('/', $info['path']))));
}
UrlEncode should be used only when encoding a string to be used in query of the url.
So my suggestion here is for you to keep with the str_replace('+', '%20', $image); code, as you have the full url and not only the query part.
The other option is to parse the url, extract the path, encode it and rebuild the url, here is one example:
$image = 'http://perfumepalace.arctechsolution.com/image/cache/data/another/For Her/Believe 100ml EDP-150x150.jpg'
$path = parse_url($image, PHP_URL_PATH);//extract the path
$epath = rawurlencode($path);//encode it
$enc_image = 'http://perfumepalace.arctechsolution.com/'.$epath;//build the new url
Try this:
$image = 'http://perfumepalace.arctechsolution.com/image/cache/data/another/For Her/Believe 100ml EDP-150x150.jpg';
$parts = parse_url($image);
$image_path = explode('/',$parts['path']);
foreach($image_path as $key => $image_path_part){
$image_path[$key] = rawurlencode($image_path_part);
}
echo $parts['scheme']."://".$parts['host'].implode('/',$image_path);
Output: http://perfumepalace.arctechsolution.com/image/cache/data/another/For%20Her/Believe%20100ml%20EDP-150x150.jpg
Have a nice day!!

Add php text string to the code

I have so stupid issue which I just can't resolve now and I need it so much..
So here's the code:
$siteURL = "http://" . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . '/';
$bookmarklet = 'javascript:document.location.href=\'' . $siteURL . '?url=\'+escape(document.location.href)';
it takes things from url, like "domain.com/?url=things"
I need the code to add http:// before "things"
I've tried adding $bookmarklet = 'http://'. $bookmarklete and changing it in various ways but it didn't helped.
Please help me guys!
It looks like line 72 of your full code is using the query string url from the page url going to the variable $url
$url = $_GET['url'];
try changing to:
$url = 'http://'.$_GET['url'];
Are you trying to change this bit of the code? You question is not very clear on what needs to be changed (what is it now Vs what you want it to be) or where your example url is coming from and where in your $bookmarklet string the 'url' part needs to go... if anywhere?
Your actual $bookmarklet string looks ok to me although as I said before it is not used in the script so you can assign it anything you like and I can't imagine it making any difference!
You could tidy the $bookmark string to this:
$bookmarklet = "javascript:location.href='$siteURL?url='+encodeURI(location.href)";
encodeURI() is the newer replacement for escape()

Retrieve and tidy up one directory name in a url. e.g. I need example.com/main/this_dir/page.html to output as "This Dir"

I am stuggling to comprehend how to accomplish the following task "
From : http://www.example.com/main/this_dir/page.html
I would like an output of : This Dir
When using $_SERVER['REQUEST_URI'] i can get this output :
*/main/this_dir/*
I would like to now take that and strip the last string between the two /'s so i end up with
*this_dir*
I would then like to take that string and turn it into
This Dir
There is a slight complication with this too because the directory could simply be called /this/ and not /this_dir/, but it is always one or the other and the text does change whereas the words i used were merely an example.
If anyone has any suggestions, input or feedback as to how i could accomplish this task it would be greatly appreciated! I do have a vague idea of how i could strip the last directory name from the request_uri string but i would really like to know if it would even be possible to transform the string in the way that i have described, using PHP.
You can use the basename function to get the "this_dir" part, so then it's simply a case of doing something like this:
$directoryName = ucwords(str_replace('_', ' ', basename($_SERVER['REQUEST_URI'])));
Edit
Slightly more convoluted example that will work for pages such as "/main/this_dir/something.php":
$directoryName = ucwords(str_replace('_', ' ', basename(substr($_SERVER['REQUEST_URI'], 0, strrpos($_SERVER['REQUEST_URI'], '/')))));
This is just stripping anything after the final "/" before passing to basename to ensure it'll work as before. Note that this will NOT work though for URLs without a trailing "/" such as "/main/this_dir" - in this case it would output "Main".
$path = explode("/", dirname($_SERVER['REQUEST_URI']));
$directory = end($path);
This should give you the last directory in the path.
Then you can do:
$dirParts = explode("_", $directory);
$dirName = implode(" ", array_map("ucfirst", $dirParts));
To get the directory name in a user-friendly format.
Edit: In fact, as RobMaster said, it is probably easier to do ucwords(str_replace("_", " ", $directory))

regexp get filename from url

url: http://blabla.bl/blabla/ss/sd/filename
How to get a filename?
http://us2.php.net/manual/en/function.basename.php
It works even on urls.
Use earcar's suggestion (basename) to get the filename.
BUT, if we're starting with a URL and the filename includes a query string, use Mauris's suggestion as well.
The query string will start with ? (that's how we know it's not part of the filename) and we can use
explode('?', basename($url));
This is summed up by the online PHP manual for basename
Given an arbitrary URL, I think you should use basename() together with parse_url(). Something like this:
$parsed_url = parse_url($url);
$path = $parsed_url['path'];
$filename = basename($path);
Yes it works, but last thing, sometimes basename is aaaa_somewhat. How to delete _somewhat?

Categories